我有一个由2列组成的数据框。 日期-季度日期 指标值-给定日期的范围从1到-1。
Date(Quarter) Indicator Value
1872-12-31 0.5
1873-03-31 -0.2
1873-06-30 -0.15
1873-09-30 0.7
1873-12-31 0.4
1874-03-31 0.9
1874-06-30 -0.3
1874-09-30 -0.1
1874-12-31 0.8
我对负值周期感兴趣。我想获取所有负值的开始日期和结束日期,但不能单独获取。例如,
First one starts at 1873/01/01 and ends in 1873/06/30
The second one starts at 1874/04/01 and ends in 1874/09/30
我尝试创建二进制值。例如,所有正数仍为零,负数仍为1。然后,我可以删除较小的数据框并获取日期。
似乎我在加倍努力。
def f(row):
if row['Indicator value'] < 0:
val = 1
else:
val = 0
return val
df['Binary Value'] = df3.apply(f, axis = 1)
数据框看起来像这样:
Date(Quaterly) Indicator Value Binary Value
1872-12-31 0.5 0
1873-03-31 -0.2 1
1873-06-30 -0.15 1
1873-09-30 0.7 0
1873-12-31 0.4 0
1874-03-31 0.9 0
1874-06-30 -0.3 1
1874-09-30 -0.1 1
1874-12-31 0.8 0
在这之后我有点卡住了。我不知道从这里去哪里。
我要创建开始日期和结束日期列表
Start Date End date
1873/01/01 1873/06/30
1874/04/01 1874/09/30
答案 0 :(得分:1)
g = (df['Indicator Value'].gt(0) == df['Indicator Value'].lt(0).shift()).cumsum()
g.name = 'value'
df = df.groupby(g).apply(lambda x: x.iloc[np.r_[0:1, -1:0]])
allneg = df[df['Indicator Value'].lt(0)].reset_index().drop(columns = ['value','level_1'])
pd.DataFrame(np.hstack([allneg.loc[::2, 'Date(Quarter)'].values.reshape(-1,1), allneg.loc[1::2, 'Date(Quarter)'].values.reshape(-1,1)]))\
.rename(columns = {0:'Start Date', 1:'End Date'})
Start Date End Date
0 1873-03-31 1873-06-30
1 1874-06-30 1874-09-30
g是我们要为“指标值”列创建的分组的创建。每当符号改变时,该值就会上升。
然后我们将g分组,然后应用一个函数,该函数在每个组中采用第一个值和最后一个值(因此,如果一行中有3个或更多的neg值,则只会采用第一个和最后一个)。
接下来,我们过滤掉正值并进行一些清洁。最后,我们操纵allneg来获取开始日期和结束日期,并使其成为新的数据框。
对于我的开始日期,我使用最初的负数,我不确定你从哪里来的。