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

5
我有一个数据框,其中包含季度美国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()将每次处理三个值的整个数据框,因此让我们查看一个特定窗口,该窗口从索引位置6开始:

   GDP
6  8   # <- gdp_val
7  2   # <- gdp_val_1
8  3   # <- gdp_val_2

如何在当前窗口中访问gdp_val、gdp_val_1和gdp_val_2?


你的问题不够清晰。提供一小部分数据样本和期望的结果将会非常有帮助。请阅读MCVE(http://stackoverflow.com/help/mcve)。 - Kartik
1
文档中提到,函数必须从ndarray输入中产生单个值...。所以你只需要对其进行索引。我认为它是传递的第一个位置参数。编写一个虚拟函数来打印它传递的内容。 - wwii
在该函数中尝试使用numpy.all(a[1:] < a[:-1]) - wwii
是的,wwii,事实证明它就像 arr[0]、arr[1]、arr[2] 一样简单。我没有意识到使用 df.rolling().apply(lambda x: my_function(x)) 将窗口元素的列表传递到 my_function() 中。 - Codedorf
3个回答

1
在.apply()中使用lambda表达式将数组传递到自定义函数(find_recession_start)中,因此我可以像访问任何列表/数组一样访问元素,例如arr[0],arr[1],arr[2]。请保留HTML标签。
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

天真的方法无法返回正确结果,因为在存在相等值和中间出现上升趋势时,你无法预测它会返回哪个索引。但是你理解了这个想法。


感谢您的输入。这不是我正在寻找的。我需要知道如何在自定义定义的函数中访问win数组的各个元素。因此,如果我有gdp.rolling(window=3).apply(lambda win: find_recession_start(win)),我如何在find_recession_start()函数内访问win的元素? - Codedorf
@Codedorf:win[0],win[1],win[2]是什么? - newtover
是的!这就是我在寻找的。谢谢! - Codedorf

0
只是一个更新。使用新的pandas版本,而不是arr[0],arr[1]等等,你需要写成arr.iloc[0],arr.iloc[1]等等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接