You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按年份对投票数据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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 05:34:09