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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 17:55:58