我试图使用统计模型按组运行线性回归,但我得到了错误:Pandas数据转换为对象的numpy-dtype。用np.aarray(data(.检查输入数据
数据类型如下:EmailCampaignId:int64、percentOpen:foat64和电子邮件日期:datetime64[ns]。
import statsmodels.api as sm
def GroupRegress(data, yvar, xvars):
Y = np.asarray(data[yvar])
X = data[xvars]
X['intercept'] = 1.
result = sm.OLS(Y, X).fit()
return result.params
df_emails.groupby('EmailCampaignId').apply(GroupRegress, 'percentOpen', ['Email Dates'])
我认为int64和float64应该是可以的,也许在datatime64上回归是个问题。如果有任何帮助,我将不胜感激!
此外,我想为表中的每个组输出R^2。我该怎么做?
是的,问题出在datetime
类型中。如果您打算使用日期作为连续预测值(即,作为间隔数据(,则可以将该列转换为int
或float
,后者将其视为天数/小时/分钟/秒或自1970年1月1日以来的其他增量,例如:
pd.to_datetime('1970-01-02').value
# 86400000000000 nanoseconds since 1/1/70
对于R平方,在下面的函数中对return
语句的编辑将在最终数据帧中作为额外的列输出这些值。
所以,
# convert date column from datetime to number of days since 1/1/70
df_emails['Email Dates'] = df_emails['Email Dates'].apply(
lambda x: x.value / (1e9 * 24 * 3600)
)
def GroupRegress(data, yvar, xvars):
Y = np.asarray(data[yvar])
X = data[xvars]
X['intercept'] = 1.
result = sm.OLS(Y, X).fit()
return result.params.append(
pd.Series([result.rsquared], index=['r_squared'])
)
res = df_emails.groupby('EmailCampaignId').apply(
GroupRegress, 'percentOpen', ['Email Dates']
)
# res will look like:
# Email Dates intercept r_squared
# EmailCampaignId
# 0 xxxx xxxx xxxx
# 1 xxxx xxxx xxxx