我希望你一切安好。
我目前正在尝试对数据框的一些组进行回归计算,但没有成功。我已经成功计算出所需的结果,但由于输出数据结构的原因,不知道如何将结果重新整合到我的原始数据框中。我尝试了两个函数。
我已经成功地进行了五分位数计算,以下是代码。
很抱歉这条消息的长度,但我正在尽力让自己表述得尽可能清晰。 软件包
如果您知道更好的创建方法,我会非常感激:)。
计算
res_reg_group2 结构更好(保留索引),但不确定如何将其与我的 df 数据框组合。此外,该 regress 函数无法用于简单回归(不带 groupby)。
谢谢您的帮助,并注意安全。
我目前正在尝试对数据框的一些组进行回归计算,但没有成功。我已经成功计算出所需的结果,但由于输出数据结构的原因,不知道如何将结果重新整合到我的原始数据框中。我尝试了两个函数。
我已经成功地进行了五分位数计算,以下是代码。
很抱歉这条消息的长度,但我正在尽力让自己表述得尽可能清晰。 软件包
import pandas as pd
from collections import OrderedDict
import statsmodels.api as sm
import numpy as np
from sklearn.linear_model import LinearRegression
函数
def regress(data, yvar, xvars):
Y = data[yvar]
X = data[xvars]
X['intercept'] = 1.
result = sm.OLS(Y, X).fit()
y_pred = result.predict()
residual = Y - y_pred
return residual
def Reg_func(x,y):
# Cross Sectional Regression
x = np.array(x).reshape((-1,1))
y = np.array(y)
model = LinearRegression().fit(x, y)
y_pred = model.intercept_ + np.sum(model.coef_ * x,axis=1)
residual = y - y_pred
return residual
Dataframe 创建
ind = ['I1', 'I2', 'I3', 'I4', 'I5', 'I6', 'I7', 'I8', 'I9', 'I10', 'I11', 'I12', 'I13', 'I14', 'I15', 'I16', 'I17', 'I18', 'I19', 'I20']
Axe = ['A', 'A', 'B', 'A', 'A', 'A', 'A', 'B', 'A', 'A', 'A', 'B', 'B', 'A', 'B', 'B', 'B', 'B', 'B', 'B']
df = pd.DataFrame(np.random.randn(20, 2), index = ind, columns=['C1', 'C2'])
df.insert(0,'Axe',Axe)
如果您知道更好的创建方法,我会非常感激:)。
计算
# Quintile groupé par Axe
QC1 = df.groupby(['Axe'])['C1'].apply(lambda x: pd.qcut(x, 5, labels=False)+1)
print(QC1)
QC1 尊重 df 结构,这样就容易将结果集成到 df 中。
# Simple regression without groupby
res_reg = Reg_func(newdf['C1'], newdf['C2'])
Res_REg可以适应df结构
# Regression per group with Reg_func fucntion
res_reg_group = (df.groupby('Axe').apply(lambda x: Reg_func(x['C1'], x['C2'])))
print(res_reg_group)
由于数据结构的原因,我真的不知道如何将结果重新整合到df中。
# Regression per group with regress function
res_reg_group2 = df.groupby('Axe').apply(regress, 'C1', ['C2'])
print(res_reg_group2)
res_reg_group2 结构更好(保留索引),但不确定如何将其与我的 df 数据框组合。此外,该 regress 函数无法用于简单回归(不带 groupby)。
谢谢您的帮助,并注意安全。