Python: 有没有办法在列表中指定的数据框的所有列上单独应用一个函数? Pyfinance 包
Python: Is there a way to apply a function separately on all columns of a dataframe specified in a list? Pyfinance package
如果有人能给我一个好的答案,我将不胜感激,因为我目前没有前进。没有任何资源帮助我和我尝试创建循环失败。
我有一个很大的股票数据框 returns,我试图在下面创建它的测试数据集。用来推导股票(相对于市场)returns 滚动贝塔的函数运行良好。但是,我无法创建一个函数来分别将其应用于 all/selected 列。
我会对两种解决方案感兴趣:
i) 这有助于我 apply/loop 数据帧的每一列的 ols.PandasRollingOLS 函数分别
ii) 和另一个仅 运行 ols.PandasRollingOLS 函数分别作用于列表
中指定的列
import pandas as pd
# intialise data
data = {'Market':[0.03, -0.01, 0.01, -0.01],
'Stock1':[0.01, -0.02, 0.03, -0.02],
'Stock2':[0.01, -0.011, 0.01, -0.011],
'Stock3':[0.01, -0.011, 0.01, -0.011],
'Stock4':[0.02, -0.1, 0.02, 0.09],
'Stock5':[-0.01, 0.01, 0.01, 0.005]}
list_stocks = ["Stock1", "Stocks2", "Stock3"]
# Create DataFrame
df = pd.DataFrame(data)
以下代码产生了正确的结果,但考虑到数据框的大小,我无法对数据集使用此解决方案:
#!pip3 install pyfinance
from pyfinance import ols
y=df["Market"]
w = 2
roll_beta["Stock1"] = ols.PandasRollingOLS(y=y, x=df[["Stock1"]], window=w).beta["Stock1"]
roll_beta["Stock2"] = ols.PandasRollingOLS(y=y, x=df[["Stock2"]], window=w).beta["Stock2"]
roll_beta["Stock3"] = ols.PandasRollingOLS(y=y, x=df[["Stock3"]], window=w).beta["Stock3"]
print(roll_beta)
$ Stock1 Stock2 Stock3
1 1.333333 1.904762 1.904762
2 0.400000 0.952381 0.952381
3 0.400000 0.952381 0.952381
您说您尝试了一个循环,但没有说明问题所在。这是一个基于您的示例的简单循环 - 这对您有用吗?
from pyfinance import ols
y=df["Market"]
w = 2
roll_beta = DataFrame()
for col in df.columns[1:]:
roll_beta[col] = ols.PandasRollingOLS(y=y, x=df[[col]], window=w).beta[col]
print(roll_beta)
如果有人能给我一个好的答案,我将不胜感激,因为我目前没有前进。没有任何资源帮助我和我尝试创建循环失败。
我有一个很大的股票数据框 returns,我试图在下面创建它的测试数据集。用来推导股票(相对于市场)returns 滚动贝塔的函数运行良好。但是,我无法创建一个函数来分别将其应用于 all/selected 列。
我会对两种解决方案感兴趣:
i) 这有助于我 apply/loop 数据帧的每一列的 ols.PandasRollingOLS 函数分别
ii) 和另一个仅 运行 ols.PandasRollingOLS 函数分别作用于列表
中指定的列import pandas as pd
# intialise data
data = {'Market':[0.03, -0.01, 0.01, -0.01],
'Stock1':[0.01, -0.02, 0.03, -0.02],
'Stock2':[0.01, -0.011, 0.01, -0.011],
'Stock3':[0.01, -0.011, 0.01, -0.011],
'Stock4':[0.02, -0.1, 0.02, 0.09],
'Stock5':[-0.01, 0.01, 0.01, 0.005]}
list_stocks = ["Stock1", "Stocks2", "Stock3"]
# Create DataFrame
df = pd.DataFrame(data)
以下代码产生了正确的结果,但考虑到数据框的大小,我无法对数据集使用此解决方案:
#!pip3 install pyfinance
from pyfinance import ols
y=df["Market"]
w = 2
roll_beta["Stock1"] = ols.PandasRollingOLS(y=y, x=df[["Stock1"]], window=w).beta["Stock1"]
roll_beta["Stock2"] = ols.PandasRollingOLS(y=y, x=df[["Stock2"]], window=w).beta["Stock2"]
roll_beta["Stock3"] = ols.PandasRollingOLS(y=y, x=df[["Stock3"]], window=w).beta["Stock3"]
print(roll_beta)
$ Stock1 Stock2 Stock3
1 1.333333 1.904762 1.904762
2 0.400000 0.952381 0.952381
3 0.400000 0.952381 0.952381
您说您尝试了一个循环,但没有说明问题所在。这是一个基于您的示例的简单循环 - 这对您有用吗?
from pyfinance import ols
y=df["Market"]
w = 2
roll_beta = DataFrame()
for col in df.columns[1:]:
roll_beta[col] = ols.PandasRollingOLS(y=y, x=df[[col]], window=w).beta[col]
print(roll_beta)