Python案例如何用Pandas做数据分组季节

wen python案例 2

本文目录导读:

Python案例如何用Pandas做数据分组季节

  1. 准备环境和数据
  2. 创建季节列的方法
  3. 按季节进行分组分析
  4. 高级分析案例
  5. 可视化分析
  6. 实际业务案例:销售预测
  7. 实用技巧总结

我来为你展示如何使用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进行季节数据分组分析的完整流程,关键点包括:

  1. 日期提取:使用 dt.month 或其他日期属性
  2. 季节映射:通过字典或函数将月份映射到季节
  3. 分组聚合:使用 groupby 进行各种统计分析
  4. 多维度分析:结合多个维度进行深层分析
  5. 可视化:使用图表直观展示季节模式

这种分析方法广泛应用于零售、旅游、能源等多个行业。

抱歉,评论功能暂时关闭!