【问题标题】:How to access individual elements within a rolling window on a dataframe如何访问数据框上滚动窗口中的各个元素
【发布时间】:2016-11-18 02:59:21
【问题描述】:

我有一个以美​​国季度 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

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

【问题讨论】:

  • 您的问题不清楚。您的数据的小样本和预期的结果将有很大帮助。请阅读MCVE
  • The docs 表示函数Must produce a single value from an ndarray input...。因此,您只需将其编入 索引即可。我想这是通过的第一个位置参数。编写一个虚拟函数来打印传递的内容。
  • 在函数中试试numpy.all(a[1:] &lt; a[:-1])
  • 是的,二战,事实证明它就像 arr[0]、arr[1]、arr[2] 一样简单。我没有意识到使用 df.rolling().apply(lambda x: my_function(x)) 会将窗口元素列表传递给 my_function()。

标签: python pandas dataframe window apply


【解决方案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

【讨论】:

    【解决方案2】:

    简短的回答是:你不能,但你可以利用你对数据框/系列结构的了解。

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

    让我们假装,这是你的 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: win[0], win[1], win[2]?
    • 是的!这就是我一直在寻找的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 2016-09-23
    相关资源
    最近更新 更多