如何通过for循环动态创建DataFrame并完成相关计算
动态简化重复的DataFrame创建代码
问题描述
我的代码目前如下:
df_1 = portfolio_all[0].rename(columns={'Close': 'Close_1'} ) df_2 = portfolio_all[1].rename(columns={'Close': 'Close_2'} ) df_3 = portfolio_all[2].rename(columns={'Close': 'Close_3'} ) df_4 = portfolio_all[3].rename(columns={'Close': 'Close_4'} ) df_5 = portfolio_all[4].rename(columns={'Close': 'Close_5'} ) df_1['daily_return_1'] = df_1['Close_1'].pct_change(1) df_2['daily_return_2'] = df_2['Close_2'].pct_change(1) df_3['daily_return_3'] = df_3['Close_3'].pct_change(1) df_4['daily_return_4'] = df_4['Close_4'].pct_change(1) df_5['daily_return_5'] = df_5['Close_5'].pct_change(1) df_1['perc_ret_1'] = (1 + df_1.daily_return_1).cumprod() - 1 df_2['perc_ret_2'] = (1 + df_2.daily_return_2).cumprod() - 1 df_3['perc_ret_3'] = (1 + df_3.daily_return_3).cumprod() - 1 df_4['perc_ret_4'] = (1 + df_4.daily_return_4).cumprod() - 1 df_5['perc_ret_5'] = (1 + df_5.daily_return_5).cumprod() - 1请问是否可以通过for循环等方式动态创建这些DataFrame,无需逐行编写每个DataFrame的代码?
解决方案
当然可以用循环简化这类重复代码,下面是几种实用的实现方式:
方式一:用字典存储DataFrame(推荐)
用字典统一管理多个DataFrame,比零散的变量更易维护,也方便后续批量操作:
# 初始化字典存储处理后的DataFrame portfolio_dfs = {} for i in range(5): idx = i + 1 # 生成从1开始的序号 # 获取对应数据并重命名Close列 current_df = portfolio_all[i].rename(columns={'Close': f'Close_{idx}'}) # 计算日收益率 current_df[f'daily_return_{idx}'] = current_df[f'Close_{idx}'].pct_change(1) # 计算累计收益率 current_df[f'perc_ret_{idx}'] = (1 + current_df[f'daily_return_{idx}']).cumprod() - 1 # 将处理后的DataFrame存入字典 portfolio_dfs[f'df_{idx}'] = current_df # 调用示例:获取第一个处理后的DataFrame # portfolio_dfs['df_1']
方式二:动态创建独立变量(不推荐)
如果一定要保留df_1、df_2这类独立变量名,可以通过globals()动态创建,但这种方式会让变量管理混乱,仅适合简单场景:
for i in range(5): idx = i + 1 current_df = portfolio_all[i].rename(columns={'Close': f'Close_{idx}'}) current_df[f'daily_return_{idx}'] = current_df[f'Close_{idx}'].pct_change(1) current_df[f'perc_ret_{idx}'] = (1 + current_df[f'daily_return_{idx}']).cumprod() - 1 # 动态创建全局变量 globals()[f'df_{idx}'] = current_df
额外优化:合并为单个DataFrame
如果后续分析需要统一处理所有数据,建议将所有标的数据合并成一个大DataFrame,操作更高效:
import pandas as pd # 初始化合并后的DataFrame merged_df = pd.DataFrame() for i in range(5): idx = i + 1 # 提取Close列并重命名后合并 temp_df = portfolio_all[i][['Close']].rename(columns={'Close': f'Close_{idx}'}) merged_df = pd.concat([merged_df, temp_df], axis=1) # 批量计算日收益率和累计收益率 for idx in range(1, 6): merged_df[f'daily_return_{idx}'] = merged_df[f'Close_{idx}'].pct_change(1) merged_df[f'perc_ret_{idx}'] = (1 + merged_df[f'daily_return_{idx}']).cumprod() - 1
内容的提问来源于stack exchange,提问作者adrCoder
相关产品推荐
相关产品推荐

