首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在数据帧上的滚动窗口中访问各个元素

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

Stack Overflow用户
提问于 2016-11-18 10:59:22
回答 2查看 3K关注 0票数 5

我有一个以季度美国GDP为列值的数据框架。我想看看这些值,一次看3个,然后找出GDP连续两个季度下降的指数。这意味着我需要将df‘’GDP‘中的各个元素以3个为一组进行相互比较。

下面是一个数据帧示例。

代码语言:javascript
复制
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()函数中访问滚动窗口的各个元素。

代码语言:javascript
复制
gdp['Recession_rolling'] = gdp['GDP'].rolling(window=3).apply(find_recession_start)

如何访问滚动窗口中的单个元素,以便进行比较,如gdp_val_2 < gdp_val_1 < gdp_val?

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

代码语言:javascript
复制
   GDP
6  8   # <- gdp_val
7  2   # <- gdp_val_1
8  3   # <- gdp_val_2

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

EN

回答 2

Stack Overflow用户

发布于 2016-11-19 11:58:42

在.apply()中使用lambda表达式将把数组传递给自定义函数(find_recession_start),因此我可以像访问任何列表/数组一样访问元素,例如arr[0], arr[1], arr[2]

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-11-18 19:08:07

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

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

让我们假设,这是您的gdp:

代码语言:javascript
复制
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)并将其添加到当前索引中:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40668660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档