gpt4 book ai didi

python - 当需要窗口中多列的所有变量时如何应用滚动函数

转载 作者:行者123 更新时间:2023-12-01 01:00:38 25 4
gpt4 key购买 nike

我正在尝试计算滚动统计数据,该统计数据需要来自两个输入列的窗口中的所有变量。

我唯一的解决方案涉及 for 循环。有没有更有效的方法,也许使用 Pandas 的滚动和应用功能?

import pandas as pd
from statsmodels.tsa.stattools import coint


def f(x):
return coint(x['a'], x['b'])[1]


df = pd.DataFrame(data={'a': [1, 2, 3, 4], 'b': [5, 6, 7, 8]})
df2 = df.rolling(2).apply(lambda x: f(x), raw=False) # KeyError: 'a'

我得到 KeyError: 'a' 因为 df 一次传递一个系列(列)到 f() 。指定 axis=1 会将一行和所有列发送到 f(),但这两种方法都无法提供所需的观察集。

最佳答案

您可以尝试滚动、平均值和总和:

df['result'] = df.rolling(2).mean().sum(axis=1)

a b result
0 1 5 0.0
1 2 6 7.0
2 3 7 9.0
3 4 8 11.0

编辑

根据 OP 问题中的新信息添加不同的答案。

设置功能。

import pandas as pd
from statsmodels.tsa.stattools import coint

def f(x):
return coint(x['a'], x['b'])

创建数据和数据框:

a_data = [1,2,3,4]
b_data = [5,6,7,8]

df = pd.DataFrame(data={'a': a_data, 'b': b_data})

a b
0 1 5
1 2 6
2 3 7
3 4 8

在研究 coint 后我发现您正在尝试将两个滚动数组传递给 f['a'] 和 f['b']。下面将创建数组和数据框。

n=2
arr_a = [df['a'].shift(x).values[::-1][:n] for x in range(len(df['a']))[::-1]]
arr_b = [df['b'].shift(x).values[::-1][:n] for x in range(len(df['b']))[::-1]]

df1 = pd.DataFrame(data={'a': arr_a, 'b': arr_b})

n 是滚动窗口的大小。

df1
a b
0 [1.0, nan] [5.0, nan]
1 [2.0, 1.0] [6.0, 5.0]
2 [3.0, 2.0] [7.0, 6.0]
3 [4, 3] [8, 7]

然后您可以使用 apply.(f) 发送数组行。

df1.iloc[(n-1):,].apply(f, axis=1)

您的输出如下:

1    (-inf, 0.0, [-48.37534, -16.26923, -10.00565])
2 (-inf, 0.0, [-48.37534, -16.26923, -10.00565])
3 (-inf, 0.0, [-48.37534, -16.26923, -10.00565])
dtype: object

当我运行这个程序时,我确实收到了完美共线数据的错误,但我怀疑该错误会随着真实数据而消失。

此外,我知道纯矢量化的解决方案可能会更快。我想知道如果它是您想要的,性能会如何?

向@Zero 致敬,他确实解决了 this problem here .

关于python - 当需要窗口中多列的所有变量时如何应用滚动函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55820646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com