Pandas & NumPy Academy · 课时

月度趋势可视化

将月度收入绘制为折线图,叠加 3 个月移动平均线,并标注收入最高和最低的月份。

第 4 / 4 课13 个步骤

月度趋势可视化 是 CoddyKit 上的免费 Pandas & NumPy Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Pandas & NumPy Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Pandas & NumPy Academy 课程共包含 4 节课。

计算月度收入总额

在绘图之前,请将销售 DataFrame 聚合为月度总额。按 year_month Period 列分组并对收入求和。使用 .to_timestamp() 将 PeriodIndex 转换为 DatetimeIndex,以便 Matplotlib 的日期格式化程序正确渲染刻度标签。按索引排序可确保折线图按时间顺序从左向右显示。

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_parquet('sales_features.parquet')

monthly = df.groupby('year_month')['revenue'].sum().sort_index()
monthly.index = monthly.index.to_timestamp()
print(monthly.head())

绘制月度收入折线图

请使用 plt.subplots(figsize=(12, 5)) 创建 Figure 和 Axes,并调用 ax.plot() 绘制月度收入趋势。使用 marker='o' 在每个月放置一个圆点,即使折线平滑,也能看清单个数据点。请设置颜色和线宽,使主要趋势在之后添加的其他图层中保持突出。

fig, ax = plt.subplots(figsize=(12, 5))

ax.plot(monthly.index, monthly.values,
        color='steelblue', linewidth=2, marker='o', markersize=5,
        label='Monthly Revenue')

ax.set_title('Monthly Revenue Trend')
ax.set_xlabel('Month')
ax.set_ylabel('Revenue (USD)')
plt.tight_layout()
plt.show()

叠加 3 个月移动平均线

原始的月度收入折线可能会因季节性噪声而显得起伏不定。请使用 monthly.rolling(3).mean() 计算并叠加3 个月滚动平均值,以更清晰地展示潜在趋势。请将其绘制为对比色的虚线,使其醒目但不遮挡原始序列。

rolling_avg = monthly.rolling(3).mean()

ax.plot(rolling_avg.index, rolling_avg.values,
        color='darkorange', linewidth=2, linestyle='--',
        label='3-Month Moving Avg')

ax.legend()
plt.show()

标注收入最高月份

请使用 ax.annotate() 标出收入最高的月份。使用 monthly.idxmax() 找到峰值月份,并使用 monthly.max() 获取其数值。标注箭头会从文本标签指向峰值数据点,使图表读者能够立即看出这一发现,包括以 PNG 或 PDF 形式接收图表的读者。

peak_date = monthly.idxmax()
peak_val = monthly.max()

ax.annotate(f'Peak: ${peak_val:,.0f}',
            xy=(peak_date, peak_val),
            xytext=(peak_date, peak_val * 1.1),
            arrowprops=dict(arrowstyle='->', color='red'),
            color='red', fontsize=10)
plt.show()

标注收入最低月份

同样地,使用 monthly.idxmin() 标记收入最低的月份,以发现潜在的季节性或业务中断。同时标注峰值和谷值,能够完整呈现收入变化:利益相关者不仅能看到表现最佳的月份,还能了解收入可能下滑到什么程度,从而为现金流规划提供依据。

trough_date = monthly.idxmin()
trough_val = monthly.min()

ax.annotate(f'Trough: ${trough_val:,.0f}',
            xy=(trough_date, trough_val),
            xytext=(trough_date, trough_val * 0.85),
            arrowprops=dict(arrowstyle='->', color='navy'),
            color='navy', fontsize=10)
plt.show()

格式化日期刻度标签

Matplotlib 默认的日期刻度标签经常会重叠,或者采用难以阅读的格式。请从 matplotlib 导入 mdates,并设置 MonthLocator 和 DateFormatter,以控制刻度频率和标签格式。将刻度标签旋转 45 度,可以避免它们在 12 个月的横轴上重叠。

import matplotlib.dates as mdates

ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %Y'))

plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.show()

为第四季度添加阴影区域

使用 ax.axvspan() 为第四季度(10 月至 12 月)添加阴影背景。这样可以立即看出季节性模式:如果峰值始终出现在阴影区域内,说明第四季度是值得通过促销重点争取的销售时期。alpha 参数控制阴影的透明度。

import datetime

q4_start = datetime.datetime(2023, 10, 1)
q4_end = datetime.datetime(2023, 12, 31)

ax.axvspan(q4_start, q4_end, alpha=0.15, color='gold', label='Q4')
ax.legend()
plt.show()

绘制随时间变化的分类收入

创建多折线图,其中每条线代表一个产品类别。将按月和类别统计的 DataFrame 透视为以类别为列、以时间为索引的格式,然后遍历各列并为每列调用 ax.plot()。在同一个 Axes 上重复调用时,Matplotlib 会自动为每条线分配不同的颜色。

monthly_cat = df.groupby(['year_month', 'category'])['revenue'].sum().unstack('category')
monthly_cat.index = monthly_cat.index.to_timestamp()

fig, ax = plt.subplots(figsize=(12, 6))
for col in monthly_cat.columns:
    ax.plot(monthly_cat.index, monthly_cat[col], label=col, linewidth=1.5)

ax.legend(loc='upper left', fontsize=8)
ax.set_title('Monthly Revenue by Category')
plt.tight_layout()
plt.show()

月度收入堆叠柱状图

堆叠柱状图既能显示每月收入总额,也能展示各类别对堆叠总量的贡献。直接在透视后的 DataFrame 上使用 monthly_cat.plot(kind='bar', stacked=True, ax=ax)。当类别少于六个时,堆叠柱状图最为合适;否则各种颜色会难以区分。

fig, ax = plt.subplots(figsize=(12, 5))

monthly_cat.plot(kind='bar', stacked=True, ax=ax, colormap='tab10')

ax.set_title('Monthly Revenue by Category (Stacked)')
ax.set_xlabel('Month')
ax.set_ylabel('Revenue')
ax.legend(loc='upper left', fontsize=8)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

环比增长率

将环比百分比增长率与收入一起绘制,可以提供更好的背景信息:一月看起来不高的柱形,可能实际代表较上月增长了 20%。使用 monthly.pct_change() * 100 计算增长率,再通过 ax.twinx() 将其绘制在辅助纵轴上,从而共享同一横轴,同时避免混淆单位。

growth = monthly.pct_change() * 100

fig, ax1 = plt.subplots(figsize=(12, 5))
ax2 = ax1.twinx()

ax1.bar(monthly.index, monthly.values, width=20, color='steelblue', alpha=0.6, label='Revenue')
ax2.plot(growth.index, growth.values, color='red', marker='o', label='MoM Growth %')

ax1.set_ylabel('Revenue')
ax2.set_ylabel('MoM Growth %')
plt.title('Revenue and Month-over-Month Growth')
plt.tight_layout()
plt.show()

保存图形用于报告

使用 fig.savefig('monthly_trend.png', dpi=150, bbox_inches='tight') 生成适合幻灯片或网页仪表板的高分辨率 PNG。bbox_inches='tight' 参数会裁剪多余的空白区域,dpi=150 则能在避免文件过大的同时提供清晰图像。对于需要打印的高质量报告,也请同时保存为 PDF。

fig.savefig('monthly_trend.png', dpi=150, bbox_inches='tight')
fig.savefig('monthly_trend.pdf', bbox_inches='tight')
print('Figure saved as PNG and PDF')

快速检查

测试您对本课数据分析概念的理解。

课程回顾

本课中,您学习了:计算月度收入总额并将其绘制为折线图、叠加滚动平均值并标注收入峰值和谷值月份,以及将适合出版的高质量图形保存为 PNG 和 PDF。接下来,我们将探索用户行为数据中的会话划分和事件序列。

免费开始

用 AI 导师学习 Python — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
30
课程
120

常见问题解答

「月度趋势可视化」课时是免费的吗?

是的 — 「月度趋势可视化」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Pandas & NumPy Academy 课程的其余内容,请升级到 CoddyKit PRO。 Pandas & NumPy Academy 课程共包含 4 节课。

「月度趋势可视化」这节课中我会学到什么?

将月度收入绘制为折线图,叠加 3 个月移动平均线,并标注收入最高和最低的月份。 你通过在浏览器中直接运行的动手代码来练习 Pandas & NumPy Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Pandas & NumPy Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Pandas & NumPy Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「月度趋势可视化」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Pandas & NumPy Academy 课中编写并运行代码吗?

能。每节 Pandas & NumPy Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 加载并审计销售数据集
  2. 收入计算与特征工程
  3. 按地区和类别进行 GroupBy 分析
  4. 月度趋势可视化
← 返回 Pandas & NumPy Academy