如何用Pandas计算每日生产件数的增长百分比?
如何计算并展示每日生产件数的增长百分比
嘿,我来帮你搞定这个问题!其实计算每日生产件数的增长百分比不需要纠结transpose()或unstack(),用pandas里的专用方法就能轻松解决,我给你一步步拆解:
先明确常见数据结构(假设你的CSV是这种格式)
通常每日生产件数的CSV会是「日期+生产数量」的长格式,比如:
date,production 2024-01-01,100 2024-01-02,120 2024-01-03,114 2024-01-04,137 2024-01-05,145
如果你的数据是宽格式(日期作为列名),我后面也会补充处理方法。
步骤1:读取并整理数据
首先用pandas读取CSV,重点是把日期列解析成日期格式,确保后续计算的正确性:
import pandas as pd # 读取CSV,自动解析date列为日期类型,并设为索引 df = pd.read_csv('production_data.csv', parse_dates=['date'], index_col='date') # 务必按日期升序排序(避免CSV里日期乱序导致计算错误) df = df.sort_index()
步骤2:计算每日增长百分比
用pandas内置的pct_change()方法就能直接算出环比增长,它会自动计算当前行相对于前一行的变化率,乘以100转成百分比格式即可:
# 计算增长百分比,保留2位小数 df['growth_pct'] = df['production'].pct_change() * 100 df['growth_pct'] = df['growth_pct'].round(2)
运行后你的数据会变成这样:
production growth_pct date 2024-01-01 100 NaN 2024-01-02 120 20.0 2024-01-03 114 -5.0 2024-01-04 137 20.18 2024-01-05 145 5.84
- 第一行的
NaN是因为没有前一天的数据,你可以用df['growth_pct'] = df['growth_pct'].fillna(0)填充为0,或者用df = df.dropna()直接删除该行。
步骤3:可视化展示(可选但直观)
如果想把增长趋势可视化,用matplotlib做双轴图就能同时展示生产件数和增长百分比:
import matplotlib.pyplot as plt plt.figure(figsize=(10,6)) # 绘制生产件数折线图 plt.plot(df.index, df['production'], marker='o', label='生产件数') # 双Y轴绘制增长百分比柱状图 ax2 = plt.gca().twinx() ax2.bar(df.index, df['growth_pct'], alpha=0.3, color='red', label='增长百分比(%)') # 美化图表 plt.title('每日生产件数及增长趋势') plt.xlabel('日期') plt.ylabel('生产件数') ax2.set_ylabel('增长百分比(%)') plt.legend(loc='upper left') ax2.legend(loc='upper right') plt.xticks(rotation=45) plt.tight_layout() plt.show()
如果你的数据是宽格式(日期为列名)怎么办?
比如CSV是这种结构:
product,2024-01-01,2024-01-02,2024-01-03 A,100,120,114 B,80,90,95
这时候需要先转成长格式再计算,用melt()方法就能搞定:
df = pd.read_csv('production_wide.csv') # 转成长格式:产品、日期、生产件数 df_long = df.melt(id_vars='product', var_name='date', value_name='production') # 解析日期列 df_long['date'] = pd.to_datetime(df_long['date']) # 按产品+日期排序 df_long = df_long.sort_values(['product', 'date']) # 分组计算每个产品的每日增长百分比 df_long['growth_pct'] = df_long.groupby('product')['production'].pct_change() * 100 df_long['growth_pct'] = df_long['growth_pct'].round(2)
内容的提问来源于stack exchange,提问作者MM55
相关产品推荐
相关产品推荐

