【问题标题】:Python sort out columns in DataFrame for OLS regressionPython 对 DataFrame 中的列进行排序以进行 OLS 回归
【发布时间】:2019-03-06 01:41:54
【问题描述】:

我有一个包含以下列的 csv 文件:

日期|Mkt-RF|SMB|HML|RF|C|aig-RF|ford-RF|ibm-RF|xom-RF|

我正在尝试在 python 中运行多重 OLS 回归,例如在“aig-RF”上回归“Mkt-RF”、“SMB”和“HML”。

似乎我需要先从数组中整理出 DataFrame,但我似乎无法理解如何:

#回归

x = df[['Mkt-RF','SMB','HML']]
y = df['aig-RF']
df = pd.DataFrame({'x':x, 'y':y})
df['constant'] = 1
df.head()
sm.OLS(y,df[['constant','x']]).fit().summary()

完整代码为:

将 numpy 导入为 np 将熊猫导入为 pd 从熊猫导入数据框 从 sklearn 导入线性模型 将 statsmodels.api 导入为 sm

def ReadFF(sIn): """ 目的: 读取FF数据

Inputs:
    sIn     string, name of input file

Return value:
    df      dataframe, data
"""
df= pd.read_csv(sIn, header=3, names=["Date","Mkt-RF","SMB","HML","RF"])
df= df.dropna(how='any')

# Reformat the dates, as date-time, and place them as index
vDate= pd.to_datetime(df["Date"].values,format='%Y%m%d')
df.index= vDate

# Add in a constant
iN= len(vDate)
df["C"]= np.ones(iN)

print(df)

return df

def JoinStock(df, sStock, sPer): """ 目的: 将股票加入数据框,作为超额收益

Inputs:
    df      dataframe, data including RF
    sStock  string, name of stock to read
    sPer    string, extension indicating period

Return value:
    df      dataframe, enlarged
"""
df1= pd.read_csv(sStock+"_"+sPer+".csv", index_col="Date", usecols=["Date", "Adj Close"])
df1.columns= [sStock]

# Add prices to original dataframe, to get correct dates
df= df.join(df1, how="left")

# Extract returns
vR= 100*np.diff(np.log(df[sStock].values))
# Add a missing, as one observation was lost differencing
vR= np.hstack([np.nan, vR])

# Add excess return to dataframe
df[sStock + "-RF"]= vR - df["RF"]
print(df)

return df

def SaveFF(df, asStock, sOut): """ 目的: 为 FF 回归保存数据

Inputs:
    df      dataframe, all data
    asStock list of strings, stocks
    sOut    string, output file name

Output:
    file written to disk
"""
df= df.dropna(how='any')

asOut= ['Mkt-RF', 'SMB', 'HML', 'RF', 'C']
for sStock in asStock:
    asOut.append(sStock+"-RF")

print ("Writing columns ", asOut, "to file ", sOut)


df.to_csv(sOut, columns=asOut, index_label="Date", float_format="%.8g")

print(df)
return df

def main():

sPer= "0018"
sIn= "Research_Data_Factors_weekly.csv"
sOut= "ffstocks"
asStock= ["aig", "ford", "ibm", "xom"]

# Initialisation
df= ReadFF(sIn)
for sStock in asStock:
    df= JoinStock(df, sStock, sPer)

# Output
SaveFF(df, asStock, sOut+"_"+sPer+".csv")
print ("Done")

# Regression
x = df[['Mkt-RF','SMB','HML']]
y = df['aig-RF']
df = pd.DataFrame({'x':x, 'y':y})
df['constant'] = 1
df.head()
sm.OLS(y,df[['constant','x']]).fit().summary()

为了得到多重OLS回归表,我需要在pd.DataFrame中修改什么?

【问题讨论】:

  • 现有代码的具体问题是什么?通读一遍,我注意到您正在尝试将多个列 (['Mkt-RF','SMB','HML']) 分配给名称 'x',您应该能够将这些列直接传递到多重线性回归器中,而无需重命名它们。
  • 多重 OLS 回归有几种方法,但我从 [链接] (rlhick.people.wm.edu/posts/estimating-custom-mle.html) 遵循这个示例,所以我仍然对如何直接传递列感到困惑。似乎一切都将在 df = pd.DateFrame({, }) 中完成,但无法弄清楚如何。
  • 我已更改为 df = DataFrame(y, x) 但问题出在 sm.OLS(y,df[['constant','x']]).fit().summary () 我得到 KeyError:“['x'] 不在索引中”。我正在尝试将 1 的列附加到 x 数据框

标签: python pandas dataframe linear-regression


【解决方案1】:

我建议将您的代码的第一块更改为以下代码(主要是交换线路顺序):

# add constant column to the original dataframe
df['constant'] = 1

# define x as a subset of original dataframe
x = df[['Mkt-RF', 'SMB', 'HML', 'constant']]

# define y as a series
y = df['aig-RF']

# pass x as a dataframe, while pass y as a series
sm.OLS(y, x).fit().summary()

希望这会有所帮助。

【讨论】:

  • 我添加了修改你的最后一行到 results = sm.OLS(y, x).fit() 和 print(results.summary()) 但仍然得到一个充满 nan 的 OLS 回归结果/跨度>
  • @user304663 好的,但至少你面临一个新问题,所以这是一个进步。我对您的数据一无所知,所以我想我无法有效地为您提供进一步的帮助。你确认你所有的“x”变量都是数字的吗?
  • 谢谢你的代码帮助,我的数据有问题!
猜你喜欢
  • 1970-01-01
  • 2022-12-11
  • 2016-05-31
  • 2021-11-21
  • 2013-05-22
  • 2022-01-21
  • 2021-04-20
  • 2013-06-13
相关资源
最近更新 更多