首页 > Pandas数据分析实战训练营 > 项目7 时间序列数据分析

项目7 时间序列数据分析

学习目标

  • 理解时间序列数据的概念和特点
  • 掌握日期解析和DatetimeIndex的创建
  • 学会使用 resample() 进行重采样
  • 掌握滚动窗口 rolling() 的计算方法
  • 学会计算同比和环比
  • 能够分析月度销售额和移动平均趋势

知识点讲解

1. 什么是时间序列数据?

时间序列数据就是按时间顺序排列的数据,比如每天的销售额、每小时的气温、每分钟的股票价格。时间序列分析的核心就是研究数据随时间变化的趋势和规律。

2. 日期解析与DatetimeIndex

pandas 可以把字符串自动转换成日期格式,最常见的方法是 pd.to_datetime()。转换后,可以把日期列设为索引,方便后续的时间操作。

# 日期解析 df['日期'] = pd.to_datetime(df['日期']) # 设为时间索引 df.set_index('日期', inplace=True)

3. resample 重采样

重采样就像"时间聚合",可以把高频数据变成低频数据。比如把日数据汇总成月数据、周数据。常用规则:'D'日、'W'周、'M'月末、'Q'季末、'Y'年末。

# 按月汇总销售额 monthly = df.resample('M')['销售额'].sum()

4. rolling 滚动窗口

滚动窗口就是"滑动的平均值"。比如 7 日移动平均,就是每一天都取前面 7 天的平均值,这样画出来的曲线更平滑,能看出长期趋势。

# 7日移动平均 df['销售额'].rolling(window=7).mean()

5. 同比与环比

同比是和去年同期比,环比是和上一个统计周期比。比如今年3月 vs 去年3月是同比,今年3月 vs 今年2月是环比。

# 环比 = 本期 / 上期 - 1 df['环比'] = df['销售额'].pct_change() # 同比需要按月份对齐,通常用 shift(12) 对月度数据

完整代码示例

import pandas as pd import numpy as np # ========== 1. 创建模拟日销售数据 ========== np.random.seed(42) dates = pd.date_range(start='2023-01-01', end='2024-06-30', freq='D') n = len(dates) # 模拟销售额:带趋势+季节性+随机波动 trend = np.linspace(5000, 8000, n) seasonal = 1000 * np.sin(2 * np.pi * np.arange(n) / 365.25) noise = np.random.normal(0, 500, n) sales = trend + seasonal + noise sales = np.clip(sales, 2000, 15000).astype(int) df = pd.DataFrame({ '日期': dates, '销售额': sales, '订单数': np.random.randint(50, 300, n) }) # 日期解析并设为索引 df['日期'] = pd.to_datetime(df['日期']) df.set_index('日期', inplace=True) print("数据预览:") print(df.head(10)) print(f"\n数据时间范围:{df.index.min()} 至 {df.index.max()}") # ========== 2. 按月重采样汇总 ========== print("\n【按月汇总销售额】") monthly_sales = df.resample('M')['销售额'].sum() print(monthly_sales.head(10)) # 同时汇总多个指标 print("\n【按月汇总:销售额总和 + 订单数总和 + 日均销售额】") monthly_multi = df.resample('M').agg({ '销售额': 'sum', '订单数': 'sum', '销售额': ['sum', 'mean'] }) print(monthly_multi.head()) # ========== 3. 按周汇总 ========== print("\n【按周汇总销售额(周一开始)】") weekly_sales = df.resample('W-MON')['销售额'].sum() print(weekly_sales.head(8)) # ========== 4. 7日移动平均 ========== print("\n【7日移动平均销售额】") df['MA7'] = df['销售额'].rolling(window=7).mean().round(2) print(df[['销售额', 'MA7']].head(14)) # ========== 5. 30日移动平均 ========== print("\n【30日移动平均销售额】") df['MA30'] = df['销售额'].rolling(window=30).mean().round(2) print(df[['销售额', 'MA7', 'MA30']].tail(10)) # ========== 6. 环比计算 ========== print("\n【月度销售额环比】") monthly = df.resample('M')['销售额'].sum() monthly_df = monthly.to_frame(name='销售额') monthly_df['环比'] = monthly_df['销售额'].pct_change().round(4) monthly_df['环比_百分比'] = (monthly_df['环比'] * 100).round(2).astype(str) + '%' print(monthly_df.head(10)) # ========== 7. 同比计算(需要两年数据) ========== print("\n【月度销售额同比(2024 vs 2023)】") # 提取年月 monthly_df['年月'] = monthly_df.index.strftime('%Y-%m') monthly_df['月份'] = monthly_df.index.month monthly_df['年份'] = monthly_df.index.year # 只取完整月份做同比 compare = monthly_df[monthly_df['年份'].isin([2023, 2024])].copy() pivot_year = compare.pivot(index='月份', columns='年份', values='销售额') pivot_year['同比'] = ((pivot_year[2024] - pivot_year[2023]) / pivot_year[2023]).round(4) print(pivot_year) # ========== 8. 季度汇总 ========== print("\n【季度销售额汇总】") quarterly = df.resample('Q')['销售额'].sum() print(quarterly) # ========== 9. 年初至今累计 ========== print("\n【2024年每月累计销售额】") df_2024 = df[df.index.year == 2024] monthly_2024 = df_2024.resample('M')['销售额'].sum() monthly_2024_cum = monthly_2024.cumsum() print(pd.DataFrame({'当月': monthly_2024, '累计': monthly_2024_cum}))

实操步骤

步骤1:新建 Notebook,运行数据生成代码,创建 2023-01-01 到 2024-06-30 的日销售数据。

步骤2:pd.to_datetime() 把日期列转成日期格式,再用 set_index() 设为索引。

步骤3:resample('M') 按月汇总销售额,观察输出结果。

步骤4:尝试 resample('W-MON') 按周(周一开始)汇总,对比月度和周度结果。

步骤5:计算 7 日移动平均,观察 MA7 曲线如何平滑原始数据的波动。

步骤6:计算月度环比,用 pct_change() 方法,观察哪个月增长最快、哪个月下降。

步骤7:筛选 2023 和 2024 两年的数据,计算每个月的同比增长率。

步骤8:cumsum() 计算 2024 年的累计销售额,看看到 6 月底累计了多少。

项目7 配套练习
0/7
第1题 选择题
resample('M') 表示按什么周期重采样?
A. 按天
B. 按周
C. 按月(月末)
D. 按年
答案解析

M 代表 Month,按月末进行重采样聚合。

第2题 选择题
rolling(window=7).mean() 计算的是什么?
A. 7天前的数值
B. 7日移动平均值
C. 每7天的总和
D. 7天后的预测值
答案解析

rolling(window=7).mean() 表示取当前及前6天共7天的平均值。

第3题 选择题
计算环比应该使用哪个方法?
A. .diff()
B. .pct_change()
C. .shift(1)
D. .cumsum()
答案解析

pct_change() 计算当前值相对前一个值的变化百分比,即环比。

第4题 选择题
同比是指与什么时间的数据进行比较?
A. 上一个统计周期
B. 去年同期
C. 数据起始日
D. 预测值
答案解析

同比是与去年同期相比,环比是与上一个统计周期相比。

第5题 判断题
pd.to_datetime() 可以把字符串格式的日期转换成 pandas 的日期类型。
正确
错误
答案解析

pd.to_datetime() 是 pandas 中最常用的日期解析函数。

第6题 填空题
在 resample 中,'Q' 代表按 ______ 进行重采样。
答案解析

Q 代表 Quarter,按季度末进行重采样。

第7题 判断题
移动窗口计算时,窗口最前面的几个值会因为数据不足而显示为 NaN。
正确
错误
答案解析

例如 window=7 时,前6个数据点不足7个,rolling结果会是NaN,从第7个点开始才有值。

0/7

项目小结

本项目我们学习了时间序列分析的核心技能:

  • pd.to_datetime() 把字符串转成日期,set_index() 把日期设为索引。
  • resample() 是时间序列的"分组聚合",'M'月、'W'周、'Q'季、'Y'年。
  • rolling(window=n).mean() 计算 n 期移动平均,平滑短期波动。
  • pct_change() 计算环比增长率,即本期相对上期的变化。
  • 同比需要把不同年份的同期数据对齐后计算。
  • cumsum() 可以计算累计值,常用于年初至今统计。

时间序列分析是商务数据分析中最常见的场景之一,掌握这些技能,你就能轻松分析销售趋势、预测未来走势!

← 上一项目:数据透视表与交叉分析 下一项目:数据可视化入门 →