Pandas DataFrame应用lambda函数无输出问题排查
问题诱发原因
核心错误是变量类型不匹配导致函数运行中途抛出类型异常,后续代码根本没有执行到,具体拆解:
- 你在
mean = "{:.15f}".format(data_pct.mean())这行,把本来是浮点型的均值结果,格式化成了字符串类型赋值给mean变量,此时mean不是可参与数值运算的数字,是类似"0.000321000000000"的文本。 - 取消
sqd = data_pct.apply(lambda x: (x-mean)**2)的注释后,代码会按顺序先执行这行逻辑:lambda表达式里会拿data_pct列里每个浮点型的对数收益率,和字符串类型的mean做减法运算,这会直接触发TypeError: unsupported operand type(s) for -: 'float' and 'str'类型错误,函数在这一步就异常终止了,后面的print(mean)语句根本没机会运行,所以你看不到任何打印输出。 - 额外隐藏问题:
pct_change()计算的百分比变动序列第一行是NaN空值,就算修复了类型问题,不提前过滤空值的话,后续对数计算、方差计算也会出现非预期结果。
修正后参考代码
import numpy as np def getVolatility(stock): data = stock.history(period="1y") # 计算对数收益率 data['PCT'] = data['Close'].astype(float).pct_change().apply(lambda x: np.log(1+x)) # 过滤空值 data_pct = data['PCT'].dropna() # 计算均值时保持数值类型,不要提前转字符串 mean = data_pct.mean() sqd = data_pct.apply(lambda x: (x-mean)**2) # 需要打印展示时再做字符串格式化 print("{:.15f}".format(mean)) print(sqd) # 补全年化波动率计算逻辑:日度收益率标准差*一年交易日数的平方根(通常取252) # annual_vol = data_pct.std() * np.sqrt(252) # return annual_vol
内容的提问来源于stack exchange,提问作者AllinTheSauce
相关产品推荐
相关产品推荐

