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

时间:2016-11-18 02:59:22

标签: python pandas dataframe window apply

我有一个数据框,其中美国季度GDP作为列值。我想一次看3个值,然后找出GDP连续两个季度下跌的指数。这意味着我需要将df [' GDP']中的各个元素相互比较,每组3个。

这是一个示例数据框。

public int InputCheck()
{
    if (userInput >= 3) 
    {
         if (userInput <= 10)
         {
             return userInput;
         }
         if (userInput > 10)
         {
             return defaulInt = userInput;
         }
      }
     if (userInput < 3)
     {
        return defaultInt = userInput;
     }
}

我正在使用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_val_2&lt; gdp_val_1&lt; gdp_val?

.rolling()。apply()将遍历整个数据帧,一次3个值,所以让我们看看一个特定的窗口,它从索引位置6开始:

gdp['Recession_rolling'] = gdp['GDP'].rolling(window=3).apply(find_recession_start)

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

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