如何从pandas dataframe中生成指定维度的minibatch训练数据?
实现步骤
你手里的是金融量化场景常见的长表格式数据,要转换为指定shape的三维训练张量,按以下步骤实现即可:
1. 依赖引入与模拟数据构造
先构造和你描述结构一致的源数据方便测试,你可以直接替换成自己的真实DataFrame:
import pandas as pd import numpy as np # 模拟源数据(你可以直接替换为自己的df) dates = pd.date_range(start="2012-01-01", end="2012-01-10") etfs = ["A00033", "A00034"] data_names = ["open", "high", "low", "close", "volume"] df_list = [] for date in dates: for etf in etfs: for dn in data_names: val = np.random.rand()*10 if dn != "volume" else np.random.randint(1000, 10000) df_list.append({"date": date, "etf": etf, "data_name": dn, "value": val}) df = pd.DataFrame(df_list)
2. 长表转宽表对齐数据
先把零散的长表数据按日期、标的、数据维度对齐,保证维度顺序固定:
# 先按日期、标的升序排序,避免时序/标的顺序错乱 df = df.sort_values(by=["date", "etf"], ignore_index=True) # 长表转宽表,索引为日期,列二级索引分别是数据维度、标的代码 pivot_df = df.pivot( index="date", columns=["data_name", "etf"], values="value" ) # 固定5个数据维度的顺序,避免乱序 pivot_df = pivot_df.reindex( columns=["open", "high", "low", "close", "volume"], level="data_name" )
3. 生成滑动窗口并调整维度
按指定回溯窗口生成切片,调整为要求的维度格式:
# 自定义参数 lookback = 5 # 训练回溯周期,可自行修改 n_channel = 5 n_assets = len(etfs) # 自动取标的总数,也可手动指定 # 转numpy数组,shape为(总日期数, n_channel * n_assets) arr = pivot_df.values # 生成滑动时间窗口,shape为(样本数, lookback, n_channel * n_assets) windowed_arr = np.lib.stride_tricks.sliding_window_view( arr, window_shape=lookback, axis=0 ).transpose(0, 2, 1) # 调整维度为(样本数, n_channel, lookback, n_assets) # 单个样本的shape即为(n_channel, lookback, n_assets),符合要求 dataset = windowed_arr.reshape(-1, lookback, n_channel, n_assets).transpose(0, 2, 1, 3) # 验证维度,第一个样本输出应为(5, 5, 2),对应(n_channel, lookback, n_assets) print(dataset[0].shape)
注意事项
- 缺失值处理:如果源数据存在缺失,可在pivot操作后通过
fillna()、dropna()做清洗,避免无效样本 - 标的顺序:如果需要固定标的排序规则,可在pivot后通过
reindex(level="etf", columns=固定标的列表)指定顺序 - 批量采样:如果需要生成minibatch,直接按第一维(样本维度)切片即可
内容的提问来源于stack exchange,提问作者verystrongjoe
相关产品推荐
相关产品推荐

