如何将按工作日统计的true_or_false列1值计数纳入statsmodels OLS回归模型?
解决方法:先聚合统计再构建OLS回归
你的问题核心是当前的OLS模型是针对单个样本的true_or_false值(0/1)做回归,但你实际需要的是针对每个工作日的1的总计数来分析工作日的影响。所以第一步需要先对原始数据做聚合统计,再用聚合后的结果构建回归模型。
步骤1:聚合统计每个工作日的1的数量
首先,我们需要按weekday分组,统计每个工作日中true_or_false列里1的出现次数。因为true_or_false是0/1数值,直接对该列求和就能得到1的数量:
import pandas as pd import statsmodels.api as sm from statsmodels.formula.api import ols # 假设你的原始DataFrame是df # 按weekday分组,统计1的数量并重置索引 count_df = df.groupby('weekday')['true_or_false'].sum().reset_index(name='count_ones') # 可选:确保0-6所有工作日都被包含(避免某个工作日无数据时被遗漏) count_df = count_df.set_index('weekday').reindex(range(7)).fillna(0).reset_index()
这段代码会生成一个新的DataFramecount_df,包含两列:
weekday:0到6的工作日编号count_ones:对应工作日中1的出现次数
步骤2:用聚合数据构建OLS回归
现在用count_ones作为因变量,weekday作为自变量(可以保留分类变量形式,和你原来的写法一致)构建回归模型:
# 构建OLS模型并拟合 fit = ols('count_ones ~ C(weekday)', data=count_df).fit() # 输出回归结果摘要 print(fit.summary())
额外说明
分类变量vs连续变量:
- 你原来用
C(weekday)是把工作日当作分类变量,回归结果会给出每个工作日相对于基准类别(默认是weekday=0)的1的数量差异。 - 如果想把工作日当作连续变量(比如假设工作日从0到6是线性变化的),可以去掉
C(),直接用公式count_ones ~ weekday,此时回归系数表示每增加一个工作日编号,1的数量的平均变化量。
- 你原来用
如果需要分析比例而非计数:
如果你关心的是每个工作日中1的占比(而不是绝对数量),可以把sum()换成mean(),得到每个工作日的1的比例,再做回归:prop_df = df.groupby('weekday')['true_or_false'].mean().reset_index(name='proportion_ones') fit = ols('proportion_ones ~ C(weekday)', data=prop_df).fit()不过这里要注意,比例数据更适合用广义线性模型(GLM)比如Logit模型,但如果坚持用OLS也是可行的。
内容的提问来源于stack exchange,提问作者JdebMkay
相关产品推荐
相关产品推荐

