我有以下数据框:
In [1]: df
Out[1]:
ID Month Transaction_Amount
1 2013/01 10
1 2013/02 20
1 2013/03 10
1 2013/04 20
1 2013/05 10
1 2013/06 20
1 2013/07 10
1 2013/08 20
1 2013/09 10
1 2013/10 20
1 2013/11 10
1 2013/12 20
1 2014/01 15
1 2014/02 25
1 2014/03 15
1 2014/04 25
...
1 2014/11 15
1 2014/12 25
...
10000000 2014/11 13
10000000 2014/12 23
我想做的是计算滚动月份的逐年增长,因此,例如,我想找到(2014/01-2013/01)/(2014/01)的值,即(15- 10)/(15)= 1/3并将其保存在第一个滚动周期中.每个ID总共有12个滚动周期.我认为最终输出应如下所示:
In [2]: df_new
Out[2]:
ID rolling_period_1 rolling_period_2 ... rolling_period_12
1 .333333 .25 .25
2 x1 x2 x12
3 y1 y2 y12
4 z1 z2 z12
...
我生成了一个包含期间[(2013/01,2014/01),(2013/02,2014/02)…(2013/12,2014/12)]每年的元组的列表,并且一直在玩isin可以索引原始df的子集,但是我不确定如何到达df_new.
编辑
我使用以下代码创建了一个名为temp_df的新数据框:
In [4]: temp_df = df[df['month'].isin(('2013/01','2014/01'))]
In [5]: temp_df
Out[5]:
ID Month Transaction_Amount
1 2013/01 10
1 2014/01 15
2 2013/01 20
2 2014/01 30
3 2013/01 15
3 2014/01 30
...
我想产生的是一个类似于以下内容的DataFrame:
In [6]: new_df
Out[6]:
ID Transaction_Growth
1 .3333 # (15-10)/15
2 .3333 # (30-20)/30
3 .50 # (30-15)/30
...
解决方法:
您可以使用shift偏移数据框中的行.
使用月份列和值列创建虚拟数据
rng = pd.date_range('1/1/2011', periods=90, freq='M')
df = pd.DataFrame({'value':range(1,91),'date':rng})
将月份列设置为索引
df = df.set_index('date')
将数据框的副本移位12个周期,以获取12个月前的值(减去当前记录的值),然后除以当前记录:
df - df.shift(12)/ df
在移位功能中更新周期上的符号
更新以考虑ID
# Create range of months
rng = pd.date_range('1/1/2011', periods=180, freq='M')
ID = np.array([1,2,3])
# Create ID column
ID = np.repeat(ID,60)
# Create dummy data in dataframe
df = pd.DataFrame({'ID':ID,'value':range(1,181),'date':rng})
# Use shift on a group by object
(df.value - df.groupby(['ID']).value.shift(12))/ df.value