项目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 月底累计了多少。
第1题
选择题
resample('M') 表示按什么周期重采样?
答案解析
M 代表 Month,按月末进行重采样聚合。
第2题
选择题
rolling(window=7).mean() 计算的是什么?
答案解析
rolling(window=7).mean() 表示取当前及前6天共7天的平均值。
第3题
选择题
计算环比应该使用哪个方法?
答案解析
pct_change() 计算当前值相对前一个值的变化百分比,即环比。
第4题
选择题
同比是指与什么时间的数据进行比较?
答案解析
同比是与去年同期相比,环比是与上一个统计周期相比。
第5题
判断题
pd.to_datetime() 可以把字符串格式的日期转换成 pandas 的日期类型。
答案解析
pd.to_datetime() 是 pandas 中最常用的日期解析函数。
第6题
填空题
在 resample 中,'Q' 代表按 ______ 进行重采样。
答案解析
Q 代表 Quarter,按季度末进行重采样。
第7题
判断题
移动窗口计算时,窗口最前面的几个值会因为数据不足而显示为 NaN。
答案解析
例如 window=7 时,前6个数据点不足7个,rolling结果会是NaN,从第7个点开始才有值。
项目小结
本项目我们学习了时间序列分析的核心技能:
pd.to_datetime() 把字符串转成日期,set_index() 把日期设为索引。
resample() 是时间序列的"分组聚合",'M'月、'W'周、'Q'季、'Y'年。
rolling(window=n).mean() 计算 n 期移动平均,平滑短期波动。
pct_change() 计算环比增长率,即本期相对上期的变化。
- 同比需要把不同年份的同期数据对齐后计算。
cumsum() 可以计算累计值,常用于年初至今统计。
时间序列分析是商务数据分析中最常见的场景之一,掌握这些技能,你就能轻松分析销售趋势、预测未来走势!