【问题标题】:Percent Increase, groupby, over time (using Python)百分比增加,groupby,随着时间的推移(使用 Python)
【发布时间】:2021-02-16 14:36:42
【问题描述】:

我有一个数据集 df,我试图在其中计算特定组在一段时间内的百分比增长。这是数据集:

    date      size       type

   1/1/2020   1          a
   1/1/2020   1          a
   1/1/2020   3          a
   1/1/2020   1          b
   1/1/2020   2          b
   1/1/2020   0          b
   2/1/2020   5          a
   2/1/2020   6          a
   2/1/2020   3          a
   2/1/2020   20         b
   2/1/2020   21         b
   2/1/2020   30         b

期望的输出

  date         increase   diff   type

  1/1/2020     200%       2      a
  1/1/2020     -40%      -2      a
  2/1/2020     -100      -1      b
  2/1/2020      50%      10      b



Percent Increase/Change is  final-inital/initial * 100

example for a , we start at 1 then end at 3, 
which is a 200% increase in the month of January

这就是我正在做的:

import pandas as pd
import numpy as np

df['date'] = pd.to_datetime(df['date'])
df1=df.groupby(['type', pd.Grouper(key='date', freq='1D')])['size'].sum()
df1['increase'] = df1['size'].pct_change().mul(100)  
df1['diff'] = df1['size'].diff() 

但是,我的日期没有正确分组。由于我只有每月第一天的连续日期,我想我可以使用 freq = '1D'

    date             

   1/1/2020            
   1/1/2020             
   1/1/2020             
   1/1/2020            

我想我必须按类型和日期分组,但我不确定,我仍在研究这个。

欢迎提出任何建议。

更新

我有一个数据集 df,我希望在其中计算特定组的总和在一段时间内的百分比增长。这是数据集:

     date     size       type

1/1/2020     1          a
1/1/2020     1          a
1/1/2020     1          a
1/1/2020     2          b
1/1/2020     5          b
1/1/2020     6          b
2/1/2020     20         a
2/1/2020     21         a
2/1/2020     10         a
2/1/2020     1          b
2/1/2020     4          b     
2/1/2020     5          b

期望的输出

(grouping by type and date to find sum)

date        size    type

1/1/2020    3       a
2/1/2020    51      a
1/1/2020    13      b
2/1/2020    10      b 

我相信这会在第一部分完成:

    df.groupby(['date','type']).sum()

(按类型查找增量和差异)

最终期望的输出:

 date        type      increase    diff
 
 2/1/2020    a         1600%       48    
 2/1/2020    b        -23.07%      -3



Percent Increase/Change is  final-inital/initial * 100

【问题讨论】:

  • 能否请您详细说明这个问题和您之前的问题的区别?例如你如何定义组a的最终和初始,因为它们只有多个相同的date。是不是对于dates 组,您选择最后一个索引作为最终索引,将第一个索引作为初始索引?
  • 谢谢。我对日期感到困惑

标签: python pandas numpy time-series


【解决方案1】:

看起来像一个简单的追星族聚合函数:

df1 = df.groupby(['type','date'])['size'].agg(lambda x:(x.iloc[-1]/x.iloc[0]-1)*100).to_frame('increase')
df1['diff'] = df.groupby(['type','date']).agg(lambda x:x.iloc[-1]-x.iloc[0])
df1.reset_index()

输出:

  type      date  increase  diff
0    a  1/1/2020       200     2
1    a  2/1/2020       -40    -2
2    b  1/1/2020      -100    -1
3    b  2/1/2020        50    10

更新

如果您想按type 增加绘图:

import matplotlib.pyplot as plt
groups = df1.groupby('type')
fig, ax = plt.subplots()
for name, group in groups:
    ax.plot(group.date, group.increase,marker='o',linestyle='',ms=12,label=name)
ax.legend()
plt.show()

输出:

UPDATE2:根据 OP 对帖子的更新:

df = df.groupby(['type','date']).sum().reset_index()
df1 = df.groupby(['type'])['size'].agg(lambda x:(x.iloc[-1]/x.iloc[0]-1)*100).to_frame('increase')
df1['diff'] = df.groupby(['type']).agg(lambda x:x.iloc[-1]-x.iloc[0])
df1['date'] = df.groupby(['type']).date.max()
df1 = df1.reset_index()

输出:

  type     increase  diff      date
0    a  1600.000000    48  2/1/2020
1    b   -23.076923    -3  2/1/2020

【讨论】:

  • 嗨@Ehaan 有没有办法将 a 和 b 完全分组到一个输出中?就像给定日期的总增长是:价值等?
  • @Lynnette 我不确定我是否理解这个问题。您想将ab 分成两个不同的数据框,还是要对它们进行多重索引?也许您可以通过示例所需的输出将其添加到您的问题中?
  • @Lynnette 是的。您可以按日期排序,也可以在聚合 lambda 函数内部排序,而不是按 iloc 选择,而是使用最大和最小日期来选择行。
  • @Lynnette 您要包含哪些日期?每个组type 与多个日期相关联。
  • @Lynnette 请检查帖子上的编辑以包括每个组类型的最新日期。我建议将来关于 SO 的问题在很大程度上形成问题,以避免回溯编辑。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-03-07
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多