多重索引的画图问题
今天做的下面这个题,画图画懵逼了
markdown
# 请绘制店铺的销售金额按年月划分的折线图:
- x轴:年月
- y轴:销售金额
- 色彩区分:部门名称
- 折线样式:店铺名称
请确保一张图上包含两个店铺,多个部门的数据,颜色和线条样式来区分不同的店铺和部门。
想要画的图长这样
因为
df.plot()
的画图方法相当于,把一个column看成画图的一组数据所以先把数据转置,变成单索引,多column的问题,如下图
然后写循环,通过循环来根据不同的店名,给不同的linestyle,就搞定了
python
departments = ['健康飲料', '大型PET', '小型PET', '水・炭酸水', '缶飲料']
# 店铺名称列表
stores = ['名古屋茶屋店', '東開店']
# 设置不同线条样式的字典
linestyles = {'名古屋茶屋店': '-', '東開店': '--'}
markers = {'名古屋茶屋店': 'o', '東開店': '*'}
# 绘制折线图
for store in stores:
for dept in departments:
store_dept = (store, dept)
linestyle = linestyles[store]
marker = markers[store]
temp[store_dept].plot(label=f'{store}_{dept}', linestyle=linestyle,marker=marker)
plt.legend(loc=(1,0.37))
# 取消科学记数法显示
plt.ticklabel_format(axis='y', style='plain')
取消科学记数法的显示
python
# 全局设置
plt.rcParams['axes.formatter.useoffset'] = False
#在图中设置
plt.ticklabel_format(axis='y', style='plain')
groupby之后的画图
- 因为要根据组画不同的图,所以分组后先不能聚合
- 分组没聚合的数据看起来和没分组之前是一模一样的,但是生成了一个DataFrameGroupBy对象
- 这个DataFrameGroupBy 对象里有三个东西:
- 分组的列:按照哪些列进行了分组。
- 如下面的例子中,按照store_format_name分组,所以循环的f_name就是具体的format_name
- 分组后的数据:通常是一个字典,其中键是分组的唯一标识符,值是对应的分组数据(DataFrame 或 Series)。
- 参考下面的例子
- 分组对象的方法:例如聚合函数(如 sum、mean、count 等)、筛选函数(如 filter)、转换函数(如 apply)等,用于对分组后的数据进行操作。
- 分组的列:按照哪些列进行了分组。
- 然后用for循环每一个组的数据,画图,做操作
客单价,按月画图有坑
客单价就是每个顾客,每天,在每个店的购买总额
但是按月画图,就会涉及到,同一个顾客一个月内多次到店的问题
所以按月份画客单价的图的问题,可以直接理解成,将客单价定义中的每天这个频度更新为每月
画图就是客单价按月画图。
举个例子:
python
# 「カテゴリ名=`大型PET(水)`」について、店別の客数と客単価を**折れ線グラフ**で表示してください。<br>
# ただし、`custoemrcd`=0のIDは非会員IDなので、集計対象外としてください。
# グラフは
# - x軸 : 年月
# - y軸 : 客単価
# - 色分け : 店舗名
# 计算客単価
avg_order_value = df_water.groupby(['ym', 'customercd', 'store_name'])['salesamount'].sum().reset_index()
# 画图
plt.figure(figsize=(12, 6))
sns.lineplot(data=avg_order_value, x='ym', y='salesamount', hue='store_name', ci=95)
plt.xlabel('年月')
plt.ylabel('客単価')
plt.title('店別客単価の推移')
plt.xticks(rotation=45)
plt.legend(title='店舗名')
plt.show()
循环画相关性的热力图
python
fig, axes = plt.subplots(2, 2, figsize=(8, 6))
for ax,(category,cdata) in zip(axes.flatten(),data.groupby('category')):
corr_matrix = cdata[['salescnt', 'salesprice']].corr()
sns.heatmap(corr_matrix,ax=ax, cmap='coolwarm',annot=True )
ax.set_title(f'Category {category}', fontsize=14)
plt.tight_layout()
