Python сортирует столбцы в DataFrame для регрессии OLS - PullRequest
0 голосов
/ 01 октября 2018

У меня есть CSV-файл со следующими столбцами:

Дата | Mkt-RF | SMB | HML | RF | C | aig-RF | ford-RF | ibm-RF | xom-RF |

Я пытаюсь запустить множественную регрессию OLS в python, например, регрессировать 'Mkt-RF', 'SMB' и 'HML' на 'aig-RF'.

Кажется, мне нужно сначала отсортировать 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 из pandas импорт DataFrame из sklearn импорт linear_model импорт statsmodels.api как sm

defReadFF (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()

Что именно мне нужно изменить в pd.DataFrame, чтобы получить таблицу множественной регрессии OLS?

1 Ответ

0 голосов
/ 01 октября 2018

Я предлагаю изменить первый фрагмент вашего кода ниже (в основном это просто обмен строк):

# 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()

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...