如何访问数据框上滚动窗口中的各个元素

问题描述 投票:0回答:3

我有一个数据框,其中美国季度 GDP 作为列值。我想一次查看 3 个值,并找到接下来连续两个季度 GDP 下降的指数。这意味着我需要以 3 为一组比较 df['GDP'] 中的各个元素。

这是一个示例数据框。

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?

python pandas dataframe window apply
3个回答
1
投票

在 .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

0
投票

简短的答案是:你不能,但你可以利用有关数据帧/系列结构的知识。

你知道窗口的大小,你知道当前索引 - 因此,你可以输出相对于当前索引的移位:

让我们假设,这是您的 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

天真的方法不会返回正确的结果,因为您无法预测当值相等以及中间出现上升时它将返回哪个索引。但你明白这个想法。


0
投票

只是更新。使用新的 pandas 版本而不是

arr[0], arr[1]
... 等等,你必须写
arr.iloc[0], arr.iloc[1]
... 等等

© www.soinside.com 2019 - 2024. All rights reserved.