Skip to content

多重索引的画图问题

今天做的下面这个题,画图画懵逼了

markdown
# 请绘制店铺的销售金额按年月划分的折线图:

- x轴:年月
- y轴:销售金额
- 色彩区分:部门名称
- 折线样式:店铺名称

请确保一张图上包含两个店铺,多个部门的数据,颜色和线条样式来区分不同的店铺和部门。

想要画的图长这样

image-20240527104635926

  • 因为df.plot() 的画图方法相当于,把一个column看成画图的一组数据

  • 所以先把数据转置,变成单索引,多column的问题,如下图

    image-20240527104721316

  • 然后写循环,通过循环来根据不同的店名,给不同的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)等,用于对分组后的数据进行操作。

image-20240527105653838

  • 然后用for循环每一个组的数据,画图,做操作

image-20240527110435294

客单价,按月画图有坑

  • 客单价就是每个顾客,每天,在每个店的购买总额

  • 但是按月画图,就会涉及到,同一个顾客一个月内多次到店的问题

  • 所以按月份画客单价的图的问题,可以直接理解成,将客单价定义中的每天这个频度更新为每月

  • 画图就是客单价按月画图。

举个例子

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()

image-20240528102623354

循环画相关性的热力图

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()
image-20240711110531460