【问题标题】:Iterating over entire columns and storing the result into a list遍历整个列并将结果存储到列表中
【发布时间】:2017-07-16 15:29:36
【问题描述】:

我想知道如何遍历数据帧的每一列以执行一些计算并将结果存储在另一个数据帧中。

df_empty = []
m = daily.ix[:,-1] #Columns= stocks & Rows= daily returns 
stocks = daily.ix[:,:-1]
for col in range (len(stocks.columns)):
    s = daily.ix[:,col]
    covmat = np.cov(s,m)
    beta = covmat[0,1]/covmat[1,1]
    return (beta)
    print(beta)

在上面的例子中,我首先要计算“s”(代表股票每日收益的列,我想对其逐一迭代)和“m”(市场每日收益)之间的协方差矩阵我的参考列/我的数据框的最后一列)。然后我想计算每个协方差对股票/市场的 beta。

我不确定为什么 return(beta) 给我一个股票的单一数字结果,而 print(beta) 打印所有股票的 beta。 我想找到一种方法来创建包含所有这些测试版的数据框。

beta_df = df_empty.append(beta)

我已经尝试了上面的代码,但它返回“无”,就好像它无法附加结果一样。 谢谢你的帮助

【问题讨论】:

  • 欢迎来到 Stack Overflow! Minimal, Complete, and Verifiable 示例使我们更容易为您提供帮助。
  • return 确实打破了循环,你为什么这样使用它?

标签: python pandas numpy


【解决方案1】:

for 循环中的return 语句在第一次遇到返回时结束循环本身。此外,您不会在任何地方保存 beta 值,因为 for 循环本身不会在 python 中返回值(它只有副作用)。

除此之外,您可以在数据帧上使用apply 选择更类似于熊猫的方法,该方法基本上迭代数据帧的列并将每一列作为第一个参数传递给提供的函数,同时返回结果的函数调用。这是一个带有一些虚拟数据的最小工作示例:

import pandas as pd
import numpy as pd

# create some dummy data
daily = pd.DataFrame(np.random.randint(100, size=(100, 5)))

# define reference column
cov_column = daily.iloc[:, -1]

# setup computation function
def compute(column):
    covmat = np.cov(column, cov_column)
    return covmat[0,1]/covmat[1,1]

# use apply to iterate over columns
result = daily.iloc[:, :-1].apply(compute)

# show output
print(result)

0   -0.125382
1    0.024777
2    0.011324
3   -0.017622
dtype: float64

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 2016-08-08
    • 2021-07-29
    • 1970-01-01
    相关资源
    最近更新 更多