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

如何在BigQuery DataFrames中通过远程函数运行pyfixest自定义回归并添加残差列

问题分析与解决方案

核心错误原因

你当前的实现存在三个关键问题:

  1. 错误使用apply(axis=1):该方法是逐行传递单行数据(Series)给远程函数,但pyfixest.feols需要完整的数据集(或分组数据集)才能拟合带固定效应的回归模型,单行数据根本无法支撑模型估计,这也是song_age_days找不到的根本原因。
  2. 远程函数参数定义错误:你声明的@bpd.remote_function(bpd.Series, int, ...)包含一个未使用的int参数,且远程函数执行时传入的是pandas对象而非bpd对象,导致to_pandas()方法报错(因为已经是pandas Series,不存在该方法)。
  3. 对分布式处理逻辑误解:BigQuery DataFrames是分布式存储的,你需要针对分区数据集而非单行数据处理,才能匹配pyfixest的运行要求。

正确实现方案

根据数据集大小,分两种场景处理:

场景1:数据集较小,可拉取到本地处理

如果数据量不大,直接将bpd DataFrame转为pandas DataFrame,本地运行pyfixest后再将残差写回:

import pyfixest as pf
import bigframes.pandas as bpd

# 读取数据
df = bpd.read_gbq(sql, use_cache=False)

# 转成pandas DataFrame本地处理
df_pandas = df.to_pandas()
# 拟合固定效应模型
m1 = pf.feols("spotify_streams ~ song_age_days | isrc", data=df_pandas)
# 添加残差列
df_pandas["residual"] = m1.resid()

# 可选:将结果写回BigQuery
df_with_residuals = bpd.DataFrame(df_pandas)
df_with_residuals.to_gbq("your_dataset.your_table", if_exists="replace")

场景2:数据集较大,需分布式处理

如果数据无法拉到本地,使用map_partitions处理每个分区的完整DataFrame,让pyfixest在每个分区内拟合模型(注意:若需全局固定效应模型,需确保单个分区能容纳全量数据,否则需调整分区策略):

import pyfixest as pf
import bigframes.pandas as bpd

# 定义远程函数:接收pandas DataFrame,返回带残差的DataFrame
@bpd.remote_function(reuse=False, packages=["pyfixest", "pandas"])
def add_residuals(pdf):
    # 拟合固定效应模型
    m1 = pf.feols("spotify_streams ~ song_age_days | isrc", data=pdf)
    # 添加残差列
    pdf["residual"] = m1.resid()
    return pdf

# 读取数据
df = bpd.read_gbq(sql, use_cache=False)

# 对每个分区应用函数,返回带残差的分布式DataFrame
df_with_residuals = df.map_partitions(add_residuals)

# 触发执行(例如查看前几行)
print(df_with_residuals.head().to_pandas())

关键注意事项

  • 若你的模型需要全局固定效应(即所有isrc的固定效应在同一个模型中估计),需确保BigQuery的分区策略能让全量数据落在单个分区内,否则map_partitions会在每个分区内单独拟合模型,结果与全局模型不一致。
  • 远程函数中无需使用bpd对象的方法,因为BigQuery会自动将分区的bpd DataFrame转为pandas DataFrame传入函数。

内容的提问来源于stack exchange,提问作者thematthiaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 01:02:03