如何使用Scipy最小化函数为Pandas DataFrame每行新增计算字段
问题原因
scipy.optimize.minimize_scalar是标量优化工具,单次仅支持一组标量参数的优化计算,直接传入DataFrame整列(Series类型)会导致目标函数返回数组,优化器无法处理。- 目标函数中使用的
math.sqrt仅支持标量输入,传入Series会直接触发类型错误。
解决方案
对DataFrame逐行调用优化函数,为每行单独计算对应的隐含增长率,同时简化原有绝对值计算逻辑避免math模块的标量限制。完整实现代码如下:
from scipy.optimize import minimize_scalar import pandas as pd # 预处理字段 df['shares_outstanding_in_millions'] = df['shares_(diluted)'] / 1000000 df['owners_income_m'] = df['owners_income'] / 1000000 # 定义单行隐含增长率计算函数 def calc_implied_growth(row): current_price = row['share_price'] shares = row['shares_outstanding_in_millions'] owners_income = row['owners_income_m'] def growth_needed(x): # 基础参数配置 fcf_growth_1_to_5 = x / 100 fcf_growth_6_to_10 = fcf_growth_1_to_5 / 2 terminal_growth_rate = 0.03 cost_of_capital = 0.1 # 计算10年自由现金流 fcf = [0]*11 fcf[1] = owners_income * (1 + fcf_growth_1_to_5) for i in range(2,6): fcf[i] = fcf[i-1] * (1 + fcf_growth_1_to_5) for i in range(6,11): fcf[i] = fcf[i-1] * (1 + fcf_growth_6_to_10) # 计算终值和各期现值 term_value = (fcf[10] * (1 + terminal_growth_rate)) / (cost_of_capital - terminal_growth_rate) pv_sum = sum([fcf[i]/((1+cost_of_capital)**i) for i in range(1,11)]) pv_tv = term_value / ((1+cost_of_capital)**11) intrinsic_value_per_share = (pv_sum + pv_tv) / shares # 等价替换原有sqrt(平方)的绝对值计算逻辑 return abs(intrinsic_value_per_share - current_price) + x try: res = minimize_scalar(growth_needed, method='bounded', bounds=(-50, 100)) return res.x / 100 except: # 优化失败返回空值避免整表计算中断 return float('nan') # 逐行计算生成新字段 df['implied_growth'] = df.apply(calc_implied_growth, axis=1)
内容的提问来源于stack exchange,提问作者Rockport Redfish
相关产品推荐
相关产品推荐

