Pandas如何将列名字符串拆分为多级索引并计算同维度产品价差
解决方案
第一步:宽表转长格式
最符合Pandas规范的实现方式是先将列名拆分转为多层索引,再通过stack方法直接转换为长表,全程无需手动遍历处理列名,代码简洁且性能优异:
import pandas as pd # 拆分列名,生成【产品编码、合约日期】两层列索引 df.columns = df.columns.str.split('.', expand=True) df.columns.names = ['Group', 'Date'] # 转长表,dropna=False保留NaN值,符合示例输出要求 long_df = df.stack(level=['Group', 'Date'], dropna=False) # 如果需要转为平表格式,执行下面的重置索引代码即可 # long_df = long_df.reset_index(name='Value')
执行后得到的long_df就完全符合你给出的长格式输出结构,自带VALUE_TIME、Group、Date三级行索引。
第二步:计算任意产品组合价差
按VALUE_TIME和Date分组后批量计算两两产品的差值即可,用itertools.combinations生成不重复的产品对,避免重复计算:
import itertools # 先转为透视表结构,方便批量做差 pivot_df = long_df.unstack(level='Group')['Value'] # 生成所有不重复的两两产品组合,如需同时保留A-B和B-A,替换为itertools.permutations即可 product_pairs = list(itertools.combinations(pivot_df.columns.tolist(), 2)) spread_result = [] for prod1, prod2 in product_pairs: # 计算价差,添加组合标识 temp = (pivot_df[prod1] - pivot_df[prod2]).reset_index(name='Value') temp['Spread'] = f'{prod1}-{prod2}' spread_result.append(temp) # 合并结果并调整索引格式 spread_df = pd.concat(spread_result, ignore_index=True).set_index(['VALUE_TIME', 'Spread', 'Date']).sort_index()
最终得到的spread_df就是你需要的价差结构,直接输出即可查看多级索引的展示效果。
内容的提问来源于stack exchange,提问作者neutralname
相关产品推荐
相关产品推荐

