Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将自定义滚动函数应用于数据帧_Python_Pandas_Numpy - Fatal编程技术网

Python 将自定义滚动函数应用于数据帧

Python 将自定义滚动函数应用于数据帧,python,pandas,numpy,Python,Pandas,Numpy,尝试将自定义滚动函数应用于熊猫数据帧时出现异常。例如: import statsmodels.api as sm import pandas as pd import numpy as np def univar_regr_beta(y, x): Y, X = y.as_matrix(), x.as_matrix() X = sm.add_constant(X) model = sm.OLS(Y, X) return model.fit().params[1

尝试将自定义滚动函数应用于熊猫数据帧时出现异常。例如:

import statsmodels.api as sm
import pandas as pd
import numpy as np

def univar_regr_beta(y, x):
    Y, X = y.as_matrix(), x.as_matrix()

    X = sm.add_constant(X)

    model = sm.OLS(Y, X)
    return model.fit().params[1]

df = pd.DataFrame(np.random.randn(20,3))
srs = pd.Series(np.random.randn(20))

# this returns a value e.g.: 0.06608957
univar_regr_beta(df[0], srs)

# and this returns a rolling sum dataframe
df.rolling(5, 5).apply(np.sum)

# but this breaks when attemp to get rolling beta
df.rolling(5, 5).apply(lambda x: univar_regr_beta(x, srs))
具体而言,我得到的例外情况如下:

AttributeError: 'numpy.ndarray' object has no attribute 'as_matrix'
看起来,当每个列通过lambda传递到univar_regr_beta时,它是作为一个凹凸数组而不是一个序列传递的。我不确定是否有更好的方法来实现滚动测试,或者我只是错过了一些东西


感谢您的帮助。谢谢

您不需要行
Y,X=Y.as_matrix(),X.as_matrix()
。只需使用
x
y
,让函数解决容器问题。您的代码中有一个更突出的问题。
lambda
参数
x
有5个元素(因为这是窗口大小)。在
univar\u regr\u beta
中的
X
也是如此。但是
srs
有20个项目,
Y
也有20个项目。如果
x
y
的长度不同,则无法构建
sm.OLS
模型。谢谢@DYZ。关于回归过程中x和y的长度差异,我实际上尝试了在使用univar_regr_beta进行回归之前,将x和y重新索引到它们的索引的交点,但出于同样的原因,我不能——来自lambda的y var不是熊猫对象,而是numpy数组。我还尝试删除as_矩阵,但由于上述原因仍然没有成功。您是否有更好的建议,可以为一个数据帧的每一列计算一个单独系列的滚动beta?在韦斯的书中,我相信他使用了OLS,但我敢肯定,这一点现在已经被弃用了。