u010137797 2024-04-22 22:37 采纳率: 0%
浏览 9

python定义了一个值但是在后面用不了

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

img

  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-22 22:37
    关注

    引自免费微信小程序:皆我百晓生

    看起来你在使用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的值。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月22日