我想获取尾十二个月(ttm)数据的值,而我仅获得年初至今的数据。我想通过添加新列来解决此问题,然后根据数据月份移动另一行。
df是这样的:
date data data_ttm
2019-03-31 12 Nan
2018-12-31 10 Nan
2018-09-30 8 Nan
2018-06-30 11 Nan
2018-03-31 9 Nan
2017-12-31 12 Nan
2017-09-30 10 Nan
2017-06-30 4 Nan
2017-03-31 7 Nan
有4个月:12-31、09-30、06-30、03-31。
对于2018-12-31,data_ttm与数据相同。
对于2018-09-30,data_ttm为:data(2018-09-30)-data(2017-09-30)+ data(2017-12-31)。
我决定添加新列['month','data_minus']来解决
df=pd.DataFrame([[datetime.datetime(2019,3,31),'12','NaN'],
[datetime.datetime(2018,12,31),'10','NaN'],
[datetime.datetime(2018,9,30),'8','NaN'],
[datetime.datetime(2018,6,30),'11','NaN'],
[datetime.datetime(2018,3,31),'9','NaN'],
[datetime.datetime(2017,12,31),'12','NaN'],
[datetime.datetime(2017,9,30),'10','NaN'],
[datetime.datetime(2017,6,30),'4','NaN'],
[datetime.datetime(2017,3,31),'7','NaN']],
columns=list(['date','data','data_ttm']))
df['month']=df['date'].map(lambda x: x.month)
df['data_minus']=df['data'].shift(-df['month']/3)-df['data'].shift(-4)
df.loc[df['month']==12,'data_minus']=0 #for the month is 12
df['data_ttm']=df['data']-df['data_minus']
并得到错误结果:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我尝试搜索错误,但是搜索到的情况与我不同。
我期望的结果是这样的:
date data data_ttm
2019-03-31 12 13
2018-12-31 10 10
2018-09-30 8 10
2018-06-30 11 19
2018-03-31 9 14
2017-12-31 12 Nan
2017-09-30 10 Nan
2017-06-30 4 Nan
2017-03-31 7 Nan
此外,我认为可能会有更好的方法来获取ttm数据。
于2019年5月4日更新
代码的问题是
df['data_minus']=df['data'].shift(-df['month']/3)-df['data'].shift(-4)
由于df['month']
是一个系列,因此报告错误。
现在我使用
for i in range(1,5):
df[df['month']==i*3,'data_minus']=df['data'].shift(-i)#.astype(float)
df['data_ttm']=df['data']+df['data_minus']-df['data'].shift(-4)#.astype(float)
替换错误一。但是我认为代码仍然很难看。有更好的方法吗?