Python:在数据框的多个列上使用函数

时间:2019-11-30 22:24:46

标签: python pandas function loops dataframe

我确信这个问题经常弹出。但是,在经历了类似的问题之后,我没有设法得出此任务的答案。

我有一个包含多只股票的收益的数据框,并且将需要仅运行单变量回归来得出滚动的beta值。

Brad Solomon的ols.PandasRollingOLS对于包括窗口/滚动非常方便。但是,我没有设法在所有股票退货列上迭代该函数。

我希望此函数循环/迭代/遍历不同股票收益的所有列。

以下,我将使用项目描述https://pypi.org/project/pyfinance/中的代码,因为它应该有助于使问题比从项目中更清楚地指出。

import numpy as np
import pandas as pd
from pyfinance import ols
from pandas_datareader import DataReader

syms = {
     'TWEXBMTH': 'usd',
     'T10Y2YM': 'term_spread',
     'PCOPPUSDM': 'copper'
     }


data = DataReader(syms.keys(), data_source='fred',
                   start='2000-01-01', end='2016-12-31')\
     .pct_change()\
     .dropna()\
     .rename(columns=syms)

y = data.pop('usd')


rolling = ols.PandasRollingOLS(y=y, x=data, window=12)

rolling.beta.head()


#DATE   term_spread copper  
#2001-01-01 0.000093    0.055448
#2001-02-01 0.000477    0.062622
#2001-03-01 0.001468    0.035703
#2001-04-01 0.001610    0.029522
#2001-05-01 0.001584    -0.044956


我希望该函数代替多元回归,以便将每一列分开并遍历整个数据框。

由于我的数据帧长超过50列,因此我希望避免经常编写该函数,例如以下代码(但是,会产生预期的结果):

rolling = ols.PandasRollingOLS(y=y, x=data[["term_spread"]], window=12).beta
rolling["copper"]= ols.PandasRollingOLS(y=y, x=data[["copper"]], window=12).beta["copper"]

#   term_spread copper
#DATE       
#2001-01-01 0.000258    0.055856
#2001-02-01 0.000611    0.064094
#2001-03-01 0.001700    0.047485
#2001-04-01 0.001778    0.040413
#2001-05-01 0.001353    -0.032264
#...    ... ...
#2016-08-01 -0.100839   -0.176078
#2016-09-01 -0.058668   -0.189192
#2016-10-01 -0.014763   -0.181441
#2016-11-01 0.046531    0.016082
#2016-12-01 0.060192    0.035062

我所做的尝试通常以“ SyntaxError:位置参数跟随关键字参数”结尾,如下所示:

def beta(r):
    z = ols.PandasRollingOLS(y=y, x=r, window=12);
    return z

0 个答案:

没有答案