查找不考虑日期顺序的百分比增加和差异(在Python中)

查找不考虑日期顺序的百分比增加和差异(在Python中),python,pandas,numpy,Python,Pandas,Numpy,我有一个数据集df,我希望在其中计算特定组的总和在一段时间内的增长百分比。以下是数据集: date size type 1/1/2020 3 a 1/1/2020 13 b 1/1/2020 1 c 2/1/2020 51 a 2/1/2019 10

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

   date      size               type
   1/1/2020  3                   a
   1/1/2020  13                  b
   1/1/2020  1                   c
   2/1/2020  51                  a
   2/1/2019  10                  b
期望输出

然后找到百分比差异和最早日期的差异

date       diff     percentdiff    type

2/1/2020   48       1600           a
1/1/2020   3        30             b
1/1/2020   0        0              c   
我们看到a组从3增加到51,(从2020年1月1日增加到2020年2月1日),这使我们的差异48,差异的百分比为1600% c组为0,因为没有变化。

这就是我尝试过的:

  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])

我还在研究这个。欢迎提出任何建议。

可能有一个更简洁的解决方案,但这是可行的:

df['date'] = pd.to_datetime(df['date'])
grouped = df.sort_values('date').groupby(['type'])

output = pd.DataFrame({
  'date': grouped['date'].agg(lambda x: x.iloc[-1]).values,
  'diff': grouped['size'].agg(lambda x: x.diff().fillna(0).iloc[-1]).values,
  'percentdiff': grouped['size'].agg(lambda x: x.pct_change().fillna(0).iloc[-1] * 100).values,
  'type': grouped['type'].agg(lambda x: x.iloc[0]).values
})

为什么期望输出中的日期是
1/1/2020
对于
b
2/1/2020
对于
a
?首先使用
groupy
,然后使用
GrouBy.agg
pct\u更改
使用最新的日期戳最早的日期是2020年1月1日,然后在2020年2月1日结束“b”开始2019年2月1日至2020年1月1日在Ch3steR group by date结束,然后是groupby.agg type,然后执行差异和pct更改?我相信。让我研究一下。非常感谢。
177.777%
26.0869%
是如何计算的?ok@Ghilas感谢您发布这篇文章。我将尝试这个,并以此为基础构建。您是如何做到的,以便代码能够以最早的日期生成的?我想知道你做了什么?谢谢@ghilas@Lynnette这是
.sort_值('date')
然后
分组['date'].agg(lambda x:x.iloc[-1])
df['date'] = pd.to_datetime(df['date'])
grouped = df.sort_values('date').groupby(['type'])

output = pd.DataFrame({
  'date': grouped['date'].agg(lambda x: x.iloc[-1]).values,
  'diff': grouped['size'].agg(lambda x: x.diff().fillna(0).iloc[-1]).values,
  'percentdiff': grouped['size'].agg(lambda x: x.pct_change().fillna(0).iloc[-1] * 100).values,
  'type': grouped['type'].agg(lambda x: x.iloc[0]).values
})