本文目录导读:

我来为你展示如何使用Pandas进行季节数据分组分析的完整案例。
准备环境和数据
import pandas as pd
import numpy as np
from datetime import datetime
import matplotlib.pyplot as plt
# 创建示例数据
np.random.seed(42)
date_rng = pd.date_range(start='2022-01-01', end='2023-12-31', freq='D')
data = {
'date': date_rng,
'sales': np.random.randint(100, 1000, size=len(date_rng)),
'temperature': np.random.uniform(-5, 35, size=len(date_rng)),
'product': np.random.choice(['A', 'B', 'C'], size=len(date_rng))
}
df = pd.DataFrame(data)
print("数据预览:")
print(df.head())
创建季节列的方法
方法1:使用month属性映射季节
def get_season(month):
if month in [3, 4, 5]:
return 'Spring'
elif month in [6, 7, 8]:
return 'Summer'
elif month in [9, 10, 11]:
return 'Fall'
else:
return 'Winter'
# 提取月份并映射到季节
df['month'] = df['date'].dt.month
df['season'] = df['month'].apply(get_season)
print("\n添加季节列后的数据:")
print(df[['date', 'month', 'season', 'sales']].head())
方法2:使用字典映射
# 更高效的字典映射方式
season_map = {
1: 'Winter', 2: 'Winter', 3: 'Spring', 4: 'Spring', 5: 'Spring',
6: 'Summer', 7: 'Summer', 8: 'Summer', 9: 'Fall', 10: 'Fall', 11: 'Fall',
12: 'Winter'
}
df['season_v2'] = df['date'].dt.month.map(season_map)
print("\n验证两种方法是否一致:")
print(df[df['season'] != df['season_v2']].shape[0], "行不一致")
按季节进行分组分析
1 基础分组统计
# 按季节分组的基本统计
season_stats = df.groupby('season').agg({
'sales': ['mean', 'std', 'min', 'max', 'sum'],
'temperature': ['mean', 'min', 'max']
}).round(2)
print("\n季节维度销售量统计:")
print(season_stats)
2 多维度分组
# 按季节和产品分组
season_product_stats = df.groupby(['season', 'product']).agg({
'sales': ['sum', 'mean', 'count'],
'temperature': 'mean'
}).round(2)
print("\n季节和产品维度统计:")
print(season_product_stats)
高级分析案例
1 季节趋势分析
# 计算每个季节的日平均销售额
season_dayly_avg = df.groupby('season')['sales'].mean().sort_values()
print("\n季节日均销售额:")
print(season_dayly_avg)
# 计算各季节销售额占比
season_total = df.groupby('season')['sales'].sum()
season_percentage = (season_total / season_total.sum() * 100).round(2)
print("\n季节销售额占比(%):")
print(season_percentage)
2 季节与温度相关性分析
# 按季节分析温度与销售的关系
season_temp_sales = df.groupby('season').agg({
'sales': ['mean', 'std'],
'temperature': ['mean', 'std']
}).round(2)
print("\n各季节温度与销售关系:")
print(season_temp_sales)
# 计算每个季节的温度-销售相关系数
correlation_by_season = df.groupby('season').apply(
lambda x: x['temperature'].corr(x['sales'])
).round(3)
print("\n各季节温度-销售相关系数:")
print(correlation_by_season)
3 时间序列分析
# 将数据设为时间索引
df_time = df.set_index('date')
# 按月重采样并添加季节信息
monthly_data = df_time.resample('M').agg({
'sales': 'sum',
'temperature': 'mean'
})
# 添加季节信息到月数据
monthly_data['season'] = monthly_data.index.month.map(season_map)
print("\n月度汇总数据:")
print(monthly_data.head())
可视化分析
# 可视化不同季节的销售分布
import seaborn as sns
plt.figure(figsize=(12, 8))
# 子图1:季节箱线图
plt.subplot(2, 2, 1)
df.boxplot(column='sales', by='season')'Seasonal Sales Distribution')
plt.xlabel('Season')
plt.ylabel('Sales')
plt.xticks(rotation=45)
# 子图2:季节销售额总和
plt.subplot(2, 2, 2)
season_total = df.groupby('season')['sales'].sum()
season_total.plot(kind='bar', color=['lightblue', 'lightgreen', 'orange', 'lightcoral'])'Total Sales by Season')
plt.xlabel('Season')
plt.ylabel('Total Sales')
plt.xticks(rotation=45)
# 子图3:各季节产品分布
plt.subplot(2, 2, 3)
season_product = df.groupby(['season', 'product']).size().unstack(fill_value=0)
season_product.plot(kind='bar', stacked=True, ax=plt.gca())'Product Distribution by Season')
plt.xlabel('Season')
plt.ylabel('Count')
plt.xticks(rotation=45)
plt.legend(title='Product')
plt.tight_layout()
plt.show()
实际业务案例:销售预测
# 创建更真实的业务数据
np.random.seed(42)
business_data = {
'date': pd.date_range('2022-01-01', '2023-12-31', freq='D'),
'revenue': np.random.normal(5000, 1000, 730) +
np.sin(np.arange(730) * 2 * np.pi / 365) * 1000, # 季节波动
'customers': np.random.poisson(100, 730),
'category': np.random.choice(['Electronics', 'Clothing', 'Food', 'Books'], 730)
}
df_business = pd.DataFrame(business_data)
df_business['season'] = df_business['date'].dt.month.map(season_map)
# 季节分析报告
def seasonal_analysis_report(df):
"""生成季节分析报告"""
report = []
# 1. 总体统计
total_revenue = df['revenue'].sum()
# 2. 季节统计
for season in ['Spring', 'Summer', 'Fall', 'Winter']:
season_data = df[df['season'] == season]
season_report = {
'season': season,
'total_revenue': season_data['revenue'].sum(),
'avg_daily_revenue': season_data['revenue'].mean(),
'total_customers': season_data['customers'].sum(),
'avg_customers_per_day': season_data['customers'].mean(),
'revenue_share': (season_data['revenue'].sum() / total_revenue * 100)
}
# 3. 最佳产品类别
best_category = season_data.groupby('category')['revenue'].sum().idxmax()
season_report['best_category'] = best_category
report.append(season_report)
return pd.DataFrame(report)
report_df = seasonal_analysis_report(df_business)
print("\n季节分析报告:")
print(report_df.round(2))
实用技巧总结
1 处理季度数据
# 使用季度标识
df['quarter'] = df['date'].dt.quarter
print("\n季度分组统计:")
print(df.groupby('quarter')['sales'].agg(['mean', 'sum']))
2 自定义季节定义
# 自定义季节(南半球季节)
south_season_map = {
1: 'Summer', 2: 'Summer', 3: 'Fall', 4: 'Fall', 5: 'Fall',
6: 'Winter', 7: 'Winter', 8: 'Winter', 9: 'Spring', 10: 'Spring', 11: 'Spring',
12: 'Summer'
}
df['south_season'] = df['date'].dt.month.map(south_season_map)
这些案例展示了如何使用Pandas进行季节数据分组分析的完整流程,关键点包括:
- 日期提取:使用
dt.month或其他日期属性 - 季节映射:通过字典或函数将月份映射到季节
- 分组聚合:使用
groupby进行各种统计分析 - 多维度分析:结合多个维度进行深层分析
- 可视化:使用图表直观展示季节模式
这种分析方法广泛应用于零售、旅游、能源等多个行业。