Python模拟结果的保存与召回方法及代码实现反馈请求
问题分析与修正
你的实现存在几个明显问题,直接运行会报错:
- 未定义变量:
year、case、prior_wealth这几个参数在循环体内没有定义,调用salary_at_year、wealth_at_year时会抛出NameError。 - 列表赋值错误:
wealth列表全程没有append任何数据,是空列表;- 构建DataFrame时,你用了
df['Salary'] = sal,这是把循环最后一次的单个sal值赋值给整列,正确的应该用salary列表(你已经做了append);同理wlt、pmt也犯了同样的错误,应该用对应的列表。
- 函数调用错误:
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很大,循环会比较慢,可以用以下方式优化:
- 用列表推导替代显式循环:把循环内的逻辑封装成单个函数,然后用列表推导批量生成结果,代码更简洁:
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
- 向量化模拟(如果支持):如果你的
years_to_retirement等函数支持向量化输入(比如接受numpy数组参数,一次性生成所有模拟结果),可以完全抛弃循环,直接用numpy生成所有数据后转DataFrame,速度会提升一个量级。 - 并行计算:如果模拟逻辑是独立的,可以用
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
相关产品推荐
相关产品推荐

