如何绘制时间序列DataFrame的多超市商品价格波动折线图
多超市疫情期商品价格走势可视化实现方案
前置数据清洗
先处理原始数据里的干扰值,否则出图会有明显偏差:
- 你样例数据里价格列的
0不是真实售价,是对应日期该超市未采集到该商品价格的标记,先统一替换为空值,避免折线被拉到0轴产生误导:
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 读取数据后执行 price_columns = ['AC', 'BFRESH', 'LIDL', 'SUPERM'] df[price_columns] = df[price_columns].replace(0, pd.NA) # 把索引的日期转成标准时间格式,保证时序轴排序正确 df.index = pd.to_datetime(df.index)
- 按条码+日期做去重校验,避免同一条码同天多条重复记录拉歪聚合结果。
全量数据初步探查方案
你提到直接画968个商品的折线会杂乱,不用硬画单商品线条,先从聚合趋势和分布特征入手:
- 大盘趋势观测:按周/月维度聚合各超市所有商品的平均售价、中位售价,画折线看整体价格走向,能快速定位疫情不同阶段各超市的整体定价变化,比如封控期是否出现普涨。参考代码:
# 按月聚合各超市平均售价 monthly_mean_price = df[price_columns].resample('M').mean() plt.figure(figsize=(12, 6)) for market in price_columns: plt.plot(monthly_mean_price.index, monthly_mean_price[market], label=market, linewidth=2) plt.title('各超市月度平均商品售价走势') plt.xlabel('日期') plt.ylabel('平均售价') plt.legend() plt.grid(alpha=0.3) plt.show()
- 全商品分布观测:如果要同时看所有商品的价格变化,把折线透明度调到0.1及以下,按超市分面绘制,密集的半透明线条会自然形成价格分布带,既能看到不同超市的商品价格区间随时间的变化,也不会因为线条堆叠显得杂乱:
# 转成长表适配分面绘图 df_long = df.reset_index().melt( id_vars=['Date', 'BARCODE'], value_vars=price_columns, var_name='supermarket', value_name='price' ) g = sns.relplot( data=df_long, x='Date', y='price', col='supermarket', kind='line', alpha=0.08, # 调低透明度 col_wrap=2, height=4, aspect=1.5, legend=False # 900多个条码不用显示图例 ) g.set_axis_labels('日期', '商品售价') g.set_titles('超市:{col_name}') plt.show()
代表性商品精细化分析
等你筛选出重点分析的商品后,就可以做清晰的单商品多超市价格对比:
- 代表性商品筛选参考逻辑:
- 优先选民生刚需品类:比如米面油、防疫物资、日常快消品,这类商品在疫情期间供需波动大,价格变化规律更有分析价值
- 选价格波动大的商品:计算每个条码全周期的价格标准差,取排名靠前的商品,这些是价格变动最明显的样本
- 选时间覆盖度高的商品:过滤掉只有零星几条记录的条码,优先选在售时间覆盖全分析周期80%以上的商品,保证走势连续可参考
- 单商品多超市折线图参考代码:
# 替换成你要分析的目标条码 target_barcode = 5201263086618 item_df = df[df['BARCODE'] == target_barcode].sort_index() plt.figure(figsize=(10, 5)) for market in price_columns: # 去掉空值再绘图,避免折线无意义断连 plot_series = item_df[market].dropna() plt.plot(plot_series.index, plot_series, marker='o', markersize=3, label=market) plt.title(f'条码{target_barcode}商品各超市售价走势') plt.xlabel('日期') plt.ylabel('售价') plt.legend() plt.grid(alpha=0.3) plt.show()
- 优化小技巧:
- 可以在图上标注当地疫情关键节点,比如封控启动、保供政策发布、解封时间,直观看事件对价格的影响
- 跨商品对比时,把价格换算成相对2020年1月基期的涨跌幅,代替绝对价格绘图,不会因为不同商品本身定价差太大影响可读性
- 批量分析时可以用交互式绘图库做可筛选、可悬停看数值的折线图,不用每次改代码出静态图
内容的提问来源于stack exchange,提问作者Zoi K.
相关产品推荐
相关产品推荐

