首页 > 解决方案 > 如何从循环写入数据帧

问题描述

我正在尝试计算 33 个股票 beta 并将它们写入数据框。

不幸的是,我的代码中有一个错误:无法连接类型为“”的对象;只有 pd.Series、pd.DataFrame 和 pd.Panel(已弃用)obj 是有效的

import pandas as pd
import numpy as np
stock1=pd.read_excel(r"C:\Users\Кир\Desktop\Uni\Master\Nasdaq\Financials 11.05\Nasdaq last\clean data\01.xlsx", '1') #read second sheet of excel file
stock2=pd.read_excel(r"C:\Users\Кир\Desktop\Uni\Master\Nasdaq\Financials 11.05\Nasdaq last\clean data\01.xlsx", '2') #read second sheet of excel file
stock2['stockreturn']=np.log(stock2.AdjCloseStock / stock2.AdjCloseStock.shift(1)) #stock ln return
stock2['SP500return']=np.log(stock2.AdjCloseSP500 / stock2.AdjCloseSP500.shift(1)) #SP500 ln return
stock2 = stock2.iloc[1:] #delete first row in dataframe
betas = pd.DataFrame()
for i in range(0,(len(stock2.AdjCloseStock)//52)-1):
    betas = betas.append(stock2.stockreturn.iloc[i*52:(i+1)*52].cov(stock2.SP500return.iloc[i*52:(i+1)*52])/stock2.SP500return.iloc[i*52:(i+1)*52].cov(stock2.SP500return.iloc[i*52:(i+1)*52]))

我的数据看起来像是 33 年的每周股票和标准普尔指数回报。所以输出应该有 33 个 beta。

标签: python-3.xpandasfinance

解决方案


我尝试简化您的代码并创建一个示例。我认为问题在于您的计算返回一个浮点数。你想让它成为一个 pd.Series。DataFrame.append需要:

DataFrame 或 Series/dict-like 对象,或这些对象的列表

np.random.seed(20)
df = pd.DataFrame(np.random.randn(33*53, 2),
                  columns=['a', 'b'])
betas = pd.DataFrame()
for year in range(len(df['a'])//52 -1):
    # Take some data
    in_slice = pd.IndexSlice[year*52:(year+1)*52]
    numerator = df['a'].iloc[in_slice].cov(df['b'].iloc[in_slice])
    denominator = df['b'].iloc[in_slice].cov(df['b'].iloc[in_slice])
    # Do some calculations and create a pd.Series from the result
    data = pd.Series(numerator / denominator, name = year)
    # Append to the DataFrame
    betas = betas.append(data)

betas.index.name = 'years'
betas.columns = ['beta']

betas.head():

           beta
years          
0      0.107669
1     -0.009302
2     -0.063200
3      0.025681
4     -0.000813

推荐阅读