大家好,这里又是七七,今天介绍的是数据探索性分析的Python代码。
目录
fig,ax=plt.subplots(figsize=(12,10))
这段代码使用Matplotlib库中的`plt.subplots`函数创建一个包含单个子图的画布和轴对象。
`fig, ax = plt.subplots(figsize=(12,10))`
`fig`是一个`Figure`对象,代表整个画布,而`ax`则是一个`Axes`对象,代表画布内部的坐标轴。
`figsize=(12,10)`参数设置了画布的宽度和高度,单位是英寸。在这个例子中,画布的宽度为12英寸,高度为10英寸。
该代码的目的是创建一个大小为12x10英寸的画布和一个带有坐标轴的子图。你可以在这个子图上进行绘图、添加数据等操作。
y1 = scaler.fit_transform(y1.values.reshape(-1, 1)).flatten()
这段代码使用`scaler.fit_transform()`方法对`y1`进行数据标准化处理。
`y1`是一个包含数据的变量,可以是一个NumPy数组或者Pandas Series对象。首先,`.values`将Pandas Series对象转换为NumPy数组。然后,`.reshape(-1, 1)`将数据的形状从一维转换为二维,其中-1表示自动计算维度。最后,`.flatten()`将二维数组展平为一维数组。
`scaler`代表一个数据标准化的对象,通常是`sklearn.preprocessing`模块中的`StandardScaler`、`MinMaxScaler`或其他标准化方法。该对象的`fit_transform()`方法将对数据进行拟合和标准化。
通过以上操作,`y1`经过标准化处理后,被赋值给`y1`本身,并且变为了一维数组。标准化处理可以将数据按照一定的比例缩放,常用于在机器学习等领域中的数据预处理步骤。
ax.plot(x,y1,label='销售单价',linestyle='-',linewidth=2)
这段代码利用Matplotlib库中的`plot()`函数在预先创建的子图对象`ax`上绘制一条折线图。
`plot()`函数的第一个参数`x`代表折线图的横坐标数据,可以是NumPy数组、Pandas Series对象等。第二个参数`y1`代表折线图的纵坐标数据,同样也可以是NumPy数组、Pandas Series对象等。
`label='销售单价'`和`linestyle='-'`分别设置折线图的标签和线型。通过这个标签,可以在图例中将不同的折线区分开;而线型则可以设定成实线、虚线、点线等,来区分不同的线条。
`linewidth=2`设置折线图的线宽。
综上,该代码在已经创建的子图对象上绘制了一条折线图,横坐标数据为`x`,纵坐标数据为`y1`,并给图线添加了标签`销售单价`、实线的线型,并将线宽设置为2。
plt.xticks(x[::5],x[::5])
plt.xticks(rotation=45)
xticks()
函数的第一个参数x[::5]
表示设置刻度的位置,其中x
是横坐标的数据,[::5]
表示每隔5个元素取一个。这样做的目的是为了避免横坐标刻度标签过于密集,只选择其中的一部分进行显示。
xticks()
函数的第二个参数x[::5]
表示设置刻度的标签,与位置参数一致。通过将x
的一部分元素作为刻度标签,可以在图上展示可读性更好的横坐标刻度。
plt.xticks(rotation=45)
意味着对当前的图形使用xticks()
函数,并将横坐标刻度标签旋转45度。
df['销售日期']=df['销售日期'].dt.to_period('w')
根据您提供的代码片段,`df['销售日期'].dt` 表示DataFrame中名为"销售日期"的列,通过`.dt`属性可以访问日期时间的处理方法和属性。
`to_period('w')` 是将日期时间转换为周期的方法。使用参数 `'w'` 表示将日期时间转换为周周期,即以周为单位进行日期分组。
通过执行 `df['销售日期'].dt.to_period('w')`,"销售日期"列中的日期时间数据将被转换为周周期,并赋值回"销售日期"列。
请注意,这只是一个日期时间转换的示例,具体的操作和结果会根据实际的DataFrame数据和需求而变化。
aggregatopm={
'销量(千克)':'sum',
'利润率':lambda x:(x*df.loc[x.index,'销量(千克)']).sum()/df.loc[x.index,'销量(千克)'].sum(),
'销售单价(元/千克)':lambda x:(x*df.loc[x.index,'销量(千克)']).sum()/df.loc[x.index,'销量(千克)'].sum(),
'批发价格(元/千克)':lambda x:(x*df.loc[x.index,'销量(千克)']).sum()/df.loc[x.index,'销量(千克)'].sum()
}
在这个聚合操作的字典中,?'销量(千克)'
?的聚合方式是求和(sum);而?'利润率'
?和?'销售单价(元/千克)'
?和?'批发价格(元/千克)'
?的聚合方式是用lambda表达式来定义,表示计算每一组的加权平均值。请注意,lambda表达式中,x
?代表的是当前组的数据。
result=grouped.agg(aggregatopm).reset_index()
首先通过?grouped.agg(aggregatopm)
?对分组后的数据进行聚合操作,并将结果存储在?result
?中。
然后使用?reset_index()
?方法对?result
?中的索引进行重置,即将分组后的索引以及聚合后的索引转换成普通的整数索引,并将其作为新 DataFrame 的一列。
在这行代码中,`.agg()` 是 pandas 中 DataFrame 或 Series 对象的一个方法,用于对数据进行聚合操作。
`.agg()` 方法可以接受一个字典作为参数,字典中的键表示要聚合的列名,值表示要应用的聚合函数或者多个聚合函数的列表。
聚合函数可以是字符串形式的函数名,比如 `'sum', 'mean', 'max', 'min'` 等,也可以是自定义的函数。
通过 `.agg()` 方法对数据进行聚合操作后,会生成一个新的 DataFrame,其中每个列对应于聚合操作的结果。
result['销售日期']=result['销售日期'].str.split('/').str[1]
这行代码假设 `result` 是一个 DataFrame,其中包含一个名为 `'销售日期'` 的列,该列的值是以斜杠(`/`)分隔的日期字符串。
`.str.split('/')` 是 Pandas 中的一个字符串方法,用于将字符串根据指定的分隔符进行分割,并返回一个包含分割后结果的列表。在这里,`result['销售日期'].str.split('/')` 将 `'销售日期'` 这一列的每个字符串根据斜杠分隔,并返回一个包含分割后结果的列表。
`.str[1]` 是对列表的取值操作,表示取出列表中的第二个元素。在这行代码中,`result['销售日期'].str.split('/').str[1]` 表示取出日期字符串中斜杠分隔后的第二个元素,也就是月份。
最后,通过 `result['销售日期'] = ...` 将 `result` DataFrame 中的 `'销售日期'` 这一列替换为提取出的月份的字符串。
这行代码的作用是将日期字符串按照斜杠进行分割,并提取出月份作为新的 `'销售日期'` 列的值。例如,将 `'2023/01/15'` 分割后得到 `[2023, 01, 15]`,然后取出第二个元素 `'01'` 作为最终的 `'销售日期'` 的值。
result.to_csv('result_weekly.csv,',index=False)
这行代码将 DataFrame `result` 中的数据保存为一个名为 `'result_weekly.csv'` 的 CSV 文件。`index=False` 参数表示不将 DataFrame 的索引写入到 CSV 文件中。
具体地,`.to_csv()` 是 Pandas 中 DataFrame 对象的一个方法,用于将数据保存为 CSV 文件。
代码示例:
result.to_csv('result_weekly.csv', index=False)
执行以上代码后,会将 `result` DataFrame 中的数据保存到 `'result_weekly.csv'` 文件中。CSV 文件是以逗号分隔的文本文件,可以在 Excel、文本编辑器等软件中打开和使用。
在保存时,`index=False` 参数表示不将 DataFrame 的索引写入 CSV 文件中,只保存列数据。
请注意,保存的 CSV 文件会在当前工作目录下创建,并命名为 `'result_weekly.csv'`。如果当前工作目录不可写入,或者文件名已经存在,可能会导致保存失败。
sns.heatmap(correlation_matrix,annot=True,cmap='coolwarm',fmt=".2f",linewidths=.5)
这行代码使用 seaborn 库的 `heatmap` 函数来创建一个热力图,它可以可视化相关性矩阵的数据。
参数解释如下:
- `correlation_matrix`:一个 DataFrame 或二维数组,代表相关性矩阵的数据。每个元素表示两个变量之间的相关性。
- `annot=True`:指定在每个方块内显示数值标签。这用于更清晰地表达相关性矩阵中的数值关系。
- `cmap='coolwarm'`:用于指定颜色映射的参数,它定义了热力图中方块颜色的色彩规则。`'coolwarm'` 是一种常用的颜色映射方案,表示低值为冷色调,高值为暖色调。
- `fmt=".2f"`:格式化字符串,用于设置数值标签的显示格式。在这里,`.2f` 表示显示两位小数。
- `linewidths=.5`:用于指定方块之间的间隔线宽度。
通过执行这行代码,你可以在屏幕上显示一个具有相关性矩阵的热力图。热力图中的每个方块的颜色表示对应位置上的数值关系,数值标签显示在方块内部,方块之间有间隔线。这样可以快速观察相关性矩阵中变量之间的关系,并找出高相关性和低相关性的模式。
import matplotlib.pyplot as plt
import pandas as pd
from tool import *
import seaborn as sns
from sklearn.preprocessing import StandardScaler
file_path=r's'
df=pd.read_excel(file_path)
#提取一个类别
df['销售日期']=pd.to_datetime(df['销售日期'])
print(df.head(5))
#品类列表
list_test=['花叶类','花菜类','水生根茎类','茄类','辣椒类','食用菌']
def plot_category(df,i):
data=df[df['品类']==list_test[i]]
print(data.head(5))
fig,ax=plt.subplots(figsize=(12,10))
x=data['销售日期']
scaler = StandardScaler()
y1=data['销售单价(元/千克)']
y1 = scaler.fit_transform(y1.values.reshape(-1, 1)).flatten()
y2 = data['批发价格(元/千克)']
y2 = scaler.fit_transform(y2.values.reshape(-1, 1)).flatten()
y3 = data['销量(千克)']
y3 = scaler.fit_transform(y3.values.reshape(-1, 1)).flatten()
ax.plot(x,y1,label='销售单价',linestyle='-',linewidth=2)
ax.plot(x,y3,label='销量',linestyle='-',linewidth=2)
ax.legend()
ax.set_title(f'{list_test[i]}销售数据')
ax.set_xlabel('销售日期')
ax.set_ylabel('标准化后的Y')
plt.xticks(x[::5],x[::5])
plt.xticks(rotation=45)
plt.show()
#按周处理一下
df['销售日期']=df['销售日期'].dt.to_period('w')
grouped=df.groupby(['销售日期','品类'])
aggregatopm={
'销量(千克)':'sum',
'利润率':lambda x:(x*df.loc[x.index,'销量(千克)']).sum()/df.loc[x.index,'销量(千克)'].sum(),
'销售单价(元/千克)':lambda x:(x*df.loc[x.index,'销量(千克)']).sum()/df.loc[x.index,'销量(千克)'].sum(),
'批发价格(元/千克)':lambda x:(x*df.loc[x.index,'销量(千克)']).sum()/df.loc[x.index,'销量(千克)'].sum()
}
#进行聚合并重置索引
result=grouped.agg(aggregatopm).reset_index()
result['销售日期']=result['销售日期'].astype(str)
result['销售日期']=result['销售日期'].str.split('/').str[1]
result.to_csv('result_weekly.csv,',index=False)
print(result)
def Correlation_analysis(df,i):
data=df[df['品类']==list_test[i]]
scaler = StandardScaler()
y1 = data['销售单价(元/千克)']
y1 = scaler.fit_transform(y1.values.reshape(-1, 1)).flatten()
y2 = data['批发价格(元/千克)']
y2 = scaler.fit_transform(y2.values.reshape(-1, 1)).flatten()
y3 = data['利润率']
y3 = scaler.fit_transform(y3.values.reshape(-1, 1)).flatten()
y4 = data['销量(千克)']
y4 = scaler.fit_transform(y4.values.reshape(-1, 1)).flatten()
data=pd.DataFrame({
'销售单价':y1,
'批发价格':y2,
'利润率':y3,
'销量':y4
})
correlation_matrix=data.corr(method='spearman')
plt.figure(figsize=(8,6))
sns.heatmap(correlation_matrix,annot=True,cmap='coolwarm',fmt=".2f",linewidths=.5)
plt.title(f"{list_test[i]}Sperman相关性分析")
plt.show()
for i in range(6):
Correlation_analysis(result,i)