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

Python模拟结果的保存与召回方法及代码实现反馈请求

问题分析与修正

你的实现存在几个明显问题,直接运行会报错:

  1. 未定义变量:year、case、prior_wealth这几个参数在循环体内没有定义,调用salary_at_year、wealth_at_year时会抛出NameError。
  2. 列表赋值错误:
    • wealth列表全程没有append任何数据,是空列表;
    • 构建DataFrame时,你用了df['Salary'] = sal,这是把循环最后一次的单个sal值赋值给整列,正确的应该用salary列表(你已经做了append);同理wlt、pmt也犯了同样的错误,应该用对应的列表。
  3. 函数调用错误:annual_pmts_case_df的第一个参数传了wealth_at_year(这是个函数对象),而不是当前模拟计算出的财富值,参数传递完全错误。

修正后的代码示例

假设years_to_retirement返回退休所需年数,且每个模拟案例中,我们需要获取退休当年的薪资、财富和年度缴纳金额,修正后的函数大概是这样:

import pandas as pd

def get_salary_wealth_year_case_df(data):
    all_ytrs = []
    salary_list = []
    wealth_list = []
    annual_payments_list = []
    
    for i in range(data.n_iter):
        # 先获取当前模拟的退休年限
        ytr = years_to_retirement(data, print_output=False)
        # 这里需要你根据实际逻辑补充case、prior_wealth的定义,比如从data中提取或者模拟生成
        case = data.case  # 示例,根据你的实际数据结构调整
        prior_wealth = data.initial_wealth  # 示例,根据实际逻辑调整
        # 获取退休当年的薪资、财富、年度缴纳额
        sal = salary_at_year(data, ytr, case, print_output=False)
        wlt = wealth_at_year(data, ytr, prior_wealth, case, print_output=False)
        pmt = annual_pmts_case_df(wlt, ytr, case, print_output=False)  # 修正参数
        
        # 将当前模拟结果加入列表
        all_ytrs.append(ytr)
        salary_list.append(sal)
        wealth_list.append(wlt)
        annual_payments_list.append(pmt)
    
    # 用列表构建DataFrame
    df = pd.DataFrame({
        'Years to Retirement': all_ytrs,
        'Salary': salary_list,
        'Wealth': wealth_list,
        'Annual Payments': annual_payments_list
    })
    return df

更高效的实现方法

如果模拟次数data.n_iter很大,循环会比较慢,可以用以下方式优化:

  1. 用列表推导替代显式循环:把循环内的逻辑封装成单个函数,然后用列表推导批量生成结果,代码更简洁:
def simulate_single_case(data):
    ytr = years_to_retirement(data, print_output=False)
    case = data.case
    prior_wealth = data.initial_wealth
    sal = salary_at_year(data, ytr, case, print_output=False)
    wlt = wealth_at_year(data, ytr, prior_wealth, case, print_output=False)
    pmt = annual_pmts_case_df(wlt, ytr, case, print_output=False)
    return (ytr, sal, wlt, pmt)

def get_salary_wealth_year_case_df(data):
    results = [simulate_single_case(data) for _ in range(data.n_iter)]
    df = pd.DataFrame(results, columns=['Years to Retirement', 'Salary', 'Wealth', 'Annual Payments'])
    return df
  1. 向量化模拟(如果支持):如果你的years_to_retirement等函数支持向量化输入(比如接受numpy数组参数,一次性生成所有模拟结果),可以完全抛弃循环,直接用numpy生成所有数据后转DataFrame,速度会提升一个量级。
  2. 并行计算:如果模拟逻辑是独立的,可以用multiprocessing或concurrent.futures库并行执行模拟,适合超大规模的迭代次数。

后续统计分析

得到DataFrame后,直接用pandas的统计方法就能快速计算均值、最值、标准差:

df = get_salary_wealth_year_case_df(data)
stats = df.agg(['mean', 'max', 'min', 'std'])
print(stats)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 21:10:28