第4章:季节性图表绘制——用Matplotlib把数据变成“会说话”的图
说实话,做农产品分析这些年,我最怕的就是客户问:“你凭什么说这个品种有季节性规律?”
光靠嘴说,没人信。你得把数据摆出来,画成图,让人一眼就看明白。
这一章,我就带你亲手画出三张核心图表:季节性走势图、箱线图、热力图。这三张图,基本能覆盖90%的季节性分析场景。
4.1 准备工作:先把数据收拾利索
在画图之前,数据必须处理干净。我个人习惯用Pandas做预处理,把日期列转成datetime格式,再提取月份和年份。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 模拟数据:某农产品近5年月度价格
np.random.seed(42)
dates = pd.date_range('2019-01-01', '2023-12-01', freq='MS')
prices = 100 + 20 * np.sin(np.linspace(0, 8*np.pi, len(dates))) + np.random.normal(0, 5, len(dates))
df = pd.DataFrame({'日期': dates, '价格': prices})
df['年份'] = df['日期'].dt.year
df['月份'] = df['日期'].dt.month
嗯,这里要注意:真实数据往往有缺失值,比如节假日没有交易。我建议先做线性插值,别直接扔掉。
4.2 季节性走势图:看“年复一年”的规律
这张图最直观。把每年同月份的价格曲线叠在一起,一眼就能看出:哪几个月涨,哪几个月跌。
plt.figure(figsize=(12, 6))
for year in df['年份'].unique():
year_data = df[df['年份'] == year]
plt.plot(year_data['月份'], year_data['价格'], marker='o', label=str(year))
plt.xlabel('月份')
plt.ylabel('价格')
plt.title('农产品月度价格季节性走势')
plt.xticks(range(1, 13), ['1月','2月','3月','4月','5月','6月',
'7月','8月','9月','10月','11月','12月'])
plt.legend()
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()
你看,如果每年曲线在某个月份都出现“尖峰”,那基本可以确定是季节性高点。我在做玉米分析时,发现每年6-7月都会有一波拉升,后来查了资料,原来是新陈粮交接期的供应紧张。
4.3 箱线图:用统计说话
箱线图能告诉你:每个月份的价格中位数、波动范围、以及有没有异常值。说白了,就是给季节性规律“上保险”。
plt.figure(figsize=(12, 6))
sns.boxplot(x='月份', y='价格', data=df)
plt.xlabel('月份')
plt.ylabel('价格')
plt.title('农产品月度价格箱线图')
plt.xticks(range(12), ['1月','2月','3月','4月','5月','6月',
'7月','8月','9月','10月','11月','12月'])
plt.grid(True, linestyle='--', alpha=0.3)
plt.show()
为什么会这样?箱线图里的“箱子”越窄,说明这个月份的价格越稳定。箱子越宽,说明波动大,风险高。
我记得有一次做苹果分析,10月份的箱子特别宽。后来发现,是因为每年开秤价差异很大,有的年份高开,有的年份低开。这时候,光看走势图是看不出来的。
4.4 热力图:发现“月份×年份”的隐藏模式
热力图是我个人最喜欢用的工具。它把数据变成颜色,一眼就能看出哪几年、哪几个月表现异常。
# 构建透视表
pivot = df.pivot_table(values='价格', index='年份', columns='月份', aggfunc='mean')
plt.figure(figsize=(12, 6))
sns.heatmap(pivot, annot=True, fmt='.0f', cmap='RdYlGn', center=pivot.values.mean())
plt.xlabel('月份')
plt.ylabel('年份')
plt.title('农产品月度价格热力图')
plt.show()
你看,颜色越绿说明价格越高,越红说明越低。如果某一行全是绿色,那这一年就是“大年”。如果某一列全是红色,那这个月份就是“淡季”。
我在做白糖分析时,用热力图发现2020年5月异常偏绿。后来一查,是因为那年印度减产,全球糖价飙升。这个发现,帮我提前布局了多头策略。
4.5 三张图怎么配合使用?
我一般这样用:
- 先看走势图:快速判断有没有季节性规律。
- 再看箱线图:确认规律是否稳定,波动大不大。
- 最后看热力图:找出异常年份和月份,深挖背后的原因。
这三张图看完,基本就能写出一份像样的季节性分析报告了。
4.6 本章小结
画图这件事,说白了就是“把数据翻译成视觉语言”。走势图讲趋势,箱线图讲分布,热力图讲模式。三张图配合使用,季节性规律就无处遁形了。
嗯,这一章的内容就到这里。代码我都贴出来了,你直接复制就能跑。如果数据换成你自己的品种,记得先做数据清洗,别偷懒。
公众号:蓝海数据掘金营,微信:deep3321