python - 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。我怎么拉这个?
解决方案
是的,问题出在datetime
类型上。如果您打算将日期用作连续预测器(即,作为间隔数据),您可以将该列转换为int
or 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
推荐阅读
- python - Python。将值更新到现有列excel
- c# - 如何在本地化和全球化中使用 If 语句?
- google-apps-script - 需要后处理写入 Google 表格的 Google 表单
- npm - 当我使用 npm install npm ERR 时出现此错误!Windows_NT 10.0.19041
- python - Jupyter Notebook 代码块不使用引号和特殊字符
- mysql - 使用 Node.JS 和 MySQL 插入数据库记录时出错
- linked-list - 二叉树遍历中序输出错误为什么?
- django - 为什么建议在 gitignore 中添加 sqlite 数据库?
- javascript - 计算表单输入中的数据
- javascript - 我可以做些什么来混合操作?使用香草 javascript