首页 > 解决方案 > StatsModels Groupby 线性回归数据类型错误:Pandas 数据转换为对象的 numpy dtype。使用 np.asarray(data) 检查输入数据

问题描述

我正在尝试使用 statsmodels 按组运行线性回归,但出现错误:Pandas data cast to numpy dtype of object。使用 np.asarray(data) 检查输入数据。

Dtypes 如下:EmailCampaignId:int64、percentOpen:float64 和电子邮件日期: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。我怎么拉这个?

标签: pythonpandasstatsmodels

解决方案


是的,问题出在datetime类型上。如果您打算将日期用作连续预测器(即,作为间隔数据),您可以将该列转换为intor 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

推荐阅读