如何基于现有DataFrame构建多级索引DataFrame并实现每日更新?
解决多级索引DataFrame构建与增量更新问题
一、构建目标多级索引DataFrame
假设原收盘价DataFrame为close_df,索引为datetime类型,列是交易代码(tickers),值为对应日期的收盘价。
1. 构建多级列索引
先通过笛卡尔积生成(ticker, period)形式的多级列,其中period为1到9:
import pandas as pd # 获取原列名(交易代码)和周期列表 tickers = close_df.columns.tolist() periods = list(range(1, 10)) # 生成多级列索引 multi_columns = pd.MultiIndex.from_product([tickers, periods], names=['ticker', 'period'])
2. 填充各周期的数据
- period=1:直接取原收盘价数据
- period=2~9:计算对应未来n天收盘价与当日收盘价的差值(period=2对应n=1,period=9对应n=8)
# 初始化空的多级索引DataFrame multi_df = pd.DataFrame(index=close_df.index, columns=multi_columns) # 填充period=1的数据 for ticker in tickers: multi_df[(ticker, 1)] = close_df[ticker] # 填充period=2~9的差值数据 for period in range(2, 10): n = period - 1 # period=2对应n=1,即D(n+1)-Dn for ticker in tickers: # 未来n天收盘价 - 当日收盘价,最后n行自动为NaN multi_df[(ticker, period)] = close_df[ticker].shift(-n) - close_df[ticker]
这种方式直接基于原索引和多级列逐个填充,能避免from_frame和product方法导致的长度不匹配问题。
二、每日新增数据的增量更新
不需要重新构建整个多级索引DataFrame,只需处理新增行并更新相关历史数据:
1. 新增单日数据的处理
假设新增的单日数据为new_row(Series类型,索引为tickers,值为当日收盘价),对应的日期为new_date:
# 1. 将新增行添加到原收盘价DataFrame close_df.loc[new_date] = new_row # 2. 为多级索引DataFrame添加空的新行 multi_df.loc[new_date] = pd.Series(index=multi_columns) # 3. 填充新行的period=1数据 for ticker in tickers: multi_df.loc[new_date, (ticker, 1)] = new_row[ticker] # 4. 更新历史行的对应period数据(新数据到来后,前8天的部分period值可计算) for n in range(1, 9): target_date = new_date - pd.Timedelta(days=n) if target_date in multi_df.index: period = n + 1 for ticker in tickers: # 计算target_date对应period的差值:新日期收盘价 - target_date收盘价 multi_df.loc[target_date, (ticker, period)] = new_row[ticker] - close_df.loc[target_date, ticker]
说明
- 新增行的period=2~9数据暂时为NaN,后续每日新增数据时,会逐步填充前8天对应period的差值。
- 每次仅需更新前1-8天的行,无需重构整个多级索引结构。
内容的提问来源于stack exchange,提问作者AndysPythonStuff
相关产品推荐
相关产品推荐

