熊猫:过去和未来的cumsum

时间:2017-09-21 08:02:51

标签: python pandas cumsum

给定单个值,及时修复:

2010-06-01 : 100

过去和未来(相对于固定日期)发生在该值上的更改列表:

Date         Diff
2010-04-01   30
2010-05-01   20
2010-07-01   60
2010-08-01   10

我想要以下结果:

Date         Value
2010-04-01   50
2010-05-01   80
2010-06-01   100
2010-07-01   160
2010-08-01   170

基本上,固定日期之后的差异将被累计求和,并且累计扣除固定日期之前的差异。

我目前的解决方案是:

  1. 将差异DataFrame过滤为两个:一个包含过去,一个包含将来的值。

  2. 取消过去的DF,将其附加到当前的DF,按降序排序,然后执行cumsum。

  3. 拿下未来的DF,将其附加到当前的DF,升序排序,并做一个cumsum。

  4. 将所有内容附加在一起。

  5. 一些入门代码:

    pd.DataFrame({'Date': ['2010-04-01', '2010-05-01', '2010-07-01', '2010-08-01'], 'Diff': [30,20,60,10]})
    
    pd.DataFrame({'Date': ['2010-06-01'], 'Value': [100]})
    

1 个答案:

答案 0 :(得分:1)

您可以创建条件并应用它们的功能:

#convert to datetimes
df1.Date = pd.to_datetime(df1.Date)
df2.Date = pd.to_datetime(df2.Date)
#join together
df = (pd.concat([df1, df2.rename(columns={'Value':'Diff'})])
       .sort_values('Date')
       .reset_index(drop=True))
print (df)
        Date  Diff
0 2010-04-01    30
1 2010-05-01    20
2 2010-06-01   100
3 2010-07-01    60
4 2010-08-01    10

m1 = df.Date < df2.loc[0, 'Date']
m2 = ~m1
#condition for select only appended value
m3 = m2[[m2.idxmax()]]
print (m3)
2    True
Name: Date, dtype: bool
#multiple by -1 by condition m1
df.loc[m1, 'Diff'] *= -1
#chained m1 and m3 for inverse cumulative sum
df.loc[m1 | m3, 'Diff'] = df.loc[m1 | m3, 'Diff'].iloc[::-1].cumsum()
#classic cumsum
df.loc[m2, 'Diff'] = df.loc[m2, 'Diff'].cumsum()
print (df)

        Date  Diff
0 2010-04-01    50
1 2010-05-01    80
2 2010-06-01   100
3 2010-07-01   160
4 2010-08-01   170