使用 Pandas 进行销售额数据分析

本文使用 Pandas 库对销售额数据进行分析,包含以下几个方面:

  1. 基本数据处理: 将日期转换为日期格式,并提取星期信息。
  2. 销售额统计:
    • 计算销售额最大值出现的星期。
    • 计算除去春节、国庆、五一节假日的月度销售总额。
    • 按季度计算周末(周六和周日)的销量总额。
    • 从最后一天开始算起,跳过周六和周一,以5天为一个时间单位向前计算销售总和。
  3. 数据错误修正: 假设数据有误,所有同一周里的周一与周五的销售额记录颠倒了,请计算2018年中每月第一个周一的销售额。
  4. 滑窗分析:
    • 以50天为窗口计算滑窗均值和滑窗最大值。
    • 规则:若当天销售额超过向前5天的均值,则记为1,否则记为0,给出相应的计算结果。
    • 将“向前5天”改为“向前非周末5天”,再次计算结果。

代码示例:

import pandas as pd
import numpy as np

# 创建数据
data = {'日期': ['2017/2/17', '2017/2/18', '2017/2/19', '2017/2/20', '2017/2/21'],
        '销售额': [2154, 2095, 3459, 2198, 2413]}
df = pd.DataFrame(data)

# (a) 销售额出现最大值的是星期几?
df['日期'] = pd.to_datetime(df['日期'])
df['星期'] = df['日期'].dt.dayofweek
max_day = df.loc[df['销售额'].idxmax(), '星期']
print("销售额出现最大值的是星期{}".format(max_day))

# (b) 计算除去春节、国庆、五一节假日的月度销售总额
# 假设春节、国庆、五一节假日分别为2月15日-2月21日、10月1日-10月7日、5月1日-5月7日
df['月份'] = df['日期'].dt.month
exclude_holidays = df[~((df['月份'] == 2) & (df['日期'].dt.day >= 15) & (df['日期'].dt.day <= 21)) &
                      ~((df['月份'] == 10) & (df['日期'].dt.day >= 1) & (df['日期'].dt.day <= 7)) &
                      ~((df['月份'] == 5) & (df['日期'].dt.day >= 1) & (df['日期'].dt.day <= 7))]
monthly_sales = exclude_holidays.groupby('月份')['销售额'].sum()
print("除去春节、国庆、五一节假日的月度销售总额:")
print(monthly_sales)

# (c) 按季度计算周末(周六和周日)的销量总额
df['季度'] = df['日期'].dt.quarter
weekend_sales = df[df['星期'].isin([5, 6])].groupby('季度')['销售额'].sum()
print("按季度计算周末的销量总额:")
print(weekend_sales)

# (d) 从最后一天开始算起,跳过周六和周一,以5天为一个时间单位向前计算销售总和
df['日期'] = pd.to_datetime(df['日期'])
df = df[::-1].reset_index(drop=True)  # 逆序排列
df['跳过'] = df['日期'].dt.dayofweek.isin([5, 0])  # 判断是否为周六或周一
df['累计销售额'] = df['销售额'].rolling(window=5, min_periods=1).sum().shift(-4)
df['累计销售额'] = np.where(df['跳过'], np.nan, df['累计销售额'])
df = df[::-1].reset_index(drop=True)  # 恢复顺序
print("从最后一天开始算起,跳过周六和周一,以5天为一个时间单位向前计算销售总和:")
print(df[['日期', '累计销售额']])

# (e) 假设现在发现数据有误,所有同一周里的周一与周五的销售额记录颠倒了,请计算2018年中每月第一个周一的销售额(如果该周没有周一或周五的记录就保持不动)
df['年份'] = df['日期'].dt.year
df['月份'] = df['日期'].dt.month
df['第一周一销售额'] = df.groupby(['年份', '月份'])['销售额'].nth(0)
df['第一周五销售额'] = df.groupby(['年份', '月份'])['销售额'].nth(-1)
df['第一周一销售额'], df['第一周五销售额'] = df['第一周五销售额'], df['第一周一销售额']
print("2018年中每月第一个周一的销售额(如果该周没有周一或周五的记录就保持不动):")
print(df[['年份', '月份', '第一周一销售额']])

# (a) 以50天为窗口计算滑窗均值和滑窗最大值(min_periods设为1)
df['滑窗均值'] = df['销售额'].rolling(window=50, min_periods=1).mean()
df['滑窗最大值'] = df['销售额'].rolling(window=50, min_periods=1).max()
print("以50天为窗口计算滑窗均值和滑窗最大值:")
print(df[['日期', '销售额', '滑窗均值', '滑窗最大值']])

# (b) 现在有如下规则:若当天销售额超过向前5天的均值,则记为1,否则记为0,请给出2018年相应的计算结果
df['向前5天均值'] = df['销售额'].rolling(window=5, min_periods=1).mean().shift()
df['结果'] = np.where(df['销售额'] > df['向前5天均值'], 1, 0)
print("2018年每天的计算结果:")
print(df[['日期', '销售额', '结果']])

# (c) 将(c)中的“向前5天”改为“向前非周末5天”,请再次计算结果
df['向前非周末5天均值'] = df['销售额'].rolling(window=5, min_periods=1).mean().shift()
df['向前非周末5天均值'] = np.where(df['跳过'], np.nan, df['向前非周末5天均值'])
df['结果'] = np.where(df['销售额'] > df['向前非周末5天均值'], 1, 0)
print("2018年每天的计算结果(向前非周末5天):")
print(df[['日期', '销售额', '结果']])

总结: 本文展示了如何使用 Pandas 进行销售额数据的统计分析,包括基本数据处理、销售额统计、数据错误修正和滑窗分析等。希望本文能够帮助读者更好地理解和应用 Pandas 库。

Pandas 数据分析:销售额统计与分析

原文地址: http://www.cveoy.top/t/topic/kd 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录