第一步已经定义了w,但是到了第二步却报错显示:name 'w' is not defined

关注引自免费微信小程序:皆我百晓生
看起来你在使用Pandas库中的groupby()函数结合pandarallel进行并行计算时遇到了问题。NameError: name 'w' is not defined表明在你的lambda函数中,变量w未被正确地定义。
解决这个问题的方法是在定义lambda函数时将w作为参数传递进去。这样,在每次执行lambda函数时,它都会接收到正确的w值。下面是修改后的代码:
# ... 其他导入语句 ...
import pandas as pd
# ... 初始化pandarallel ...
w = 12
min_p = 10
# 对数据排序
DF = DF.sort_values(['permno', 'date'])
# 定义一个包含w的局部作用域的匿名函数
def rolling_covariance(x, w=w):
return x['xret'].rolling(w, min_periods=min_p).cov(x['mkt'])
# 使用lambda函数时,传递w作为参数
DF['cov'] = DF.groupby('permno').parallel_apply(rolling_covariance)
# 计算variance
DF['var'] = DF.groupby('permno')['mkt'].rolling(w, min_periods=min_p).var()
# 计算beta_1
DF['beta_1'] = DF['cov'] / DF['var']
# 显示前几行数据
DF.head()
这段代码应该能正常运行,因为在lambda函数内通过额外的参数w=w确保了w的值被正确传递。这样,无论在哪个进程中执行这个lambda函数,都能访问到w的值。注意,这里我将lambda函数替换为一个简单的函数rolling_covariance,并将w作为默认参数传递。这可以确保在并行计算环境中也能正确获取到w的值。