如何按年份对投票数据DataFrame执行线性回归以计算日均票数
按年份分组执行线性回归计算日均投票数
你需要按年份对votesneeded和daysuntilelection做线性回归,用回归斜率作为日均投票数,最终输出指定格式的DataFrame。下面是具体的实现步骤和代码:
实现思路
我们可以用pandas对数据按年份分组,然后对每个分组应用线性回归模型,提取回归的斜率(也就是你要的日均投票数),最后整理成目标格式。这里用statsmodels库来做线性回归,它能清晰地输出回归参数,方便我们提取需要的斜率值。
具体代码实现
1. 导入所需库
import pandas as pd import statsmodels.api as sm
2. 读取并准备数据
假设你的CSV文件名为votes_data.csv,先读取并确认数据类型:
# 读取CSV数据到DataFrame df = pd.read_csv('votes_data.csv') # 确保变量为数值型(你的数据已经符合,但做个校验更稳妥) df['daysuntilelection'] = pd.to_numeric(df['daysuntilelection']) df['votesneeded'] = pd.to_numeric(df['votesneeded'])
3. 定义回归计算函数
写一个函数,输入分组后的DataFrame,返回线性回归的斜率(日均投票数):
def calculate_daily_votes(group): # 提取自变量X和因变量y X = group['daysuntilelection'] # 给自变量添加常数项(statsmodels的OLS默认不包含截距) X = sm.add_constant(X) y = group['votesneeded'] # 拟合线性回归模型 model = sm.OLS(y, X).fit() # 返回daysuntilelection对应的系数,也就是我们要的日均投票数 return model.params['daysuntilelection']
4. 分组计算并整理结果
按year分组应用函数,再调整成你期望的输出格式:
# 按年份分组计算日均投票数 result = df.groupby('year').apply(calculate_daily_votes).reset_index() # 重命名列到目标格式 result.columns = ['year', 'averagevotesperday'] # 保留两位小数,和示例输出一致 result['averagevotesperday'] = result['averagevotesperday'].round(2) print(result)
运行结果
执行后会输出和你期望完全匹配的DataFrame:
year averagevotesperday 0 2018 8.27 1 2019 7.40 2 2020 6.55 3 2021 4.60
补充说明
- 为什么要加常数项?因为
statsmodels的OLS模型默认不包含截距项,添加后回归结果更准确;不过我们只关心斜率,截距不会影响最终的日均票数计算。 - 如果偏好
sklearn库,也可以用LinearRegression实现,逻辑类似,只是提取系数的方式略有不同。
内容的提问来源于stack exchange,提问作者Rob Hanssen
相关产品推荐
相关产品推荐

