Python 如何访问数据帧上滚动窗口中的单个元素

Python 如何访问数据帧上滚动窗口中的单个元素,python,pandas,dataframe,window,apply,Python,Pandas,Dataframe,Window,Apply,我有一个以季度美国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.

我有一个以季度美国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(查找衰退)
,但我不知道如何在
查找衰退()函数中访问滚动窗口的各个元素

gdp['Recession_rolling'] = gdp['GDP'].rolling(window=3).apply(find_recession_start)
如何访问滚动窗口中的单个元素,以便进行比较,例如gdp_val_2 Apple()将一次遍历整个数据文件,3个值,所以让我们来看一个特定的窗口,它从索引位置6开始:

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

6 8#简单的回答是:你不能,但你可以利用你对数据帧/系列结构的了解

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

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

<朴素的方法不会返回正确的结果,因为你不能预测当有相等的值时它会返回哪个索引,当中间有上升的时候。但是您理解这个想法。

在.apply()中使用lambda表达式会将数组传递到自定义函数(find\u recession\u 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
df=pd.DataFrame(data=np.random.randint(0,10,10),columns=['GDP']))
定义我的职能(arr):
如果((arr[2]
您的问题不清楚。一个小样本的数据和预期的结果将有很大帮助。请阅读。假设函数
必须从ndarray输入中生成一个值…
。所以你只是索引到它。我想这是第一个通过的位置参数。编写一个伪函数来打印它所传递的内容。在函数中尝试
numpy.all(a[1:
。是的,二战期间,结果证明它与arr[0]、arr[1]、arr[2]一样简单。我没有意识到使用df.rolling().apply(lambda x:my_function(x))会将窗口元素列表传递到my_function()。感谢您的输入。这不是我想要的。我需要知道如何在自定义函数中访问win数组的各个元素。因此,如果我有gdp.rolling(window=3).apply(lambda-win:find\u recession\u start(win)),我如何访问find\u recession\u start()中的win元素?@Codedorf:win[0],win[1],win[2]?是的!这就是我要找的。非常感谢。