我有一个以季度美国GDP为列值的数据框架。我想看看这些值,一次看3个,然后找出GDP连续两个季度下降的指数。这意味着我需要将df‘’GDP‘中的各个元素以3个为一组进行相互比较。
下面是一个数据帧示例。
df = pd.DataFrame(data=np.random.randint(0,10,10), columns=['GDP'])
df
GDP
0 4
1 4
2 4
3 1
4 4
5 4
6 8
7 2
8 3
9 9我使用的是df.rolling().apply(find_recession),但我不知道如何在find_recession()函数中访问滚动窗口的各个元素。
gdp['Recession_rolling'] = gdp['GDP'].rolling(window=3).apply(find_recession_start)如何访问滚动窗口中的单个元素,以便进行比较,如gdp_val_2 < gdp_val_1 < gdp_val?
.rolling().apply()将遍历整个数据帧,一次3个值,所以让我们看一下从索引位置6开始的一个特定窗口:
GDP
6 8 # <- gdp_val
7 2 # <- gdp_val_1
8 3 # <- gdp_val_2如何在当前窗口中访问gdp_val、gdp_val_1和gdp_val_2?
发布于 2016-11-19 11:58:42
在.apply()中使用lambda表达式将把数组传递给自定义函数(find_recession_start),因此我可以像访问任何列表/数组一样访问元素,例如arr[0], arr[1], arr[2]
df = pd.DataFrame(data=np.random.randint(0,10,10), columns=['GDP'])
def my_func(arr):
if((arr[2] < arr[1]) & (arr[1] < arr[0])):
return 1
else:
return 0
df['Result'] = df.rolling(window=3).apply(lambda x: my_func(x))
df
GDP Result
0 8 NaN
1 0 NaN
2 8 0.0
3 1 0.0
4 9 0.0
5 7 0.0
6 9 0.0
7 8 0.0
8 3 1.0
9 9 0.0发布于 2016-11-18 19:08:07
简短的答案是:您不能,但您可以利用您对数据帧/系列结构的了解。
你知道窗口的大小,你知道当前的索引-因此,你可以输出相对于当前索引的移位:
让我们假设,这是您的gdp:
In [627]: gdp
Out[627]:
0 8
1 0
2 0
3 4
4 0
5 3
6 6
7 2
8 5
9 5
dtype: int64简单的方法是返回(argmin() - 2)并将其添加到当前索引中:
In [630]: gdp.rolling(window=3).apply(lambda win: win.argmin() - 2) + gdp.index
Out[630]:
0 NaN
1 NaN
2 1.0
3 1.0
4 2.0
5 4.0
6 4.0
7 7.0
8 7.0
9 7.0
dtype: float64天真的方法不会返回正确的结果,因为您无法预测当存在相等的值时以及当中间存在上升时,它将返回哪个索引。但是你明白我的意思。
https://stackoverflow.com/questions/40668660
复制相似问题