pivot与melt:宽表长表的形态变换
我的掌握程度:
先掌握这个答案
pivot:长→宽——df.pivot(index='date', columns='code', values='close')→日期为行、代码为列的矩阵。逆操作:stack()或melt()把宽表还原为长表。适用分工:宽表适合矩阵运算(rank(axis=1)横截面排名、矩阵乘法组合收益);长表适合存储(省空间)和groupby聚合。实际上panel最常用的是unstack('code')(MultiIndex长表→宽表)而非pivot——效果等价但保留索引信息。
先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。
从理解到使用
本阶段实战方法 · 一条能复现的数据流水线
把接口返回的数据变成可用于因子研究的面板时,先处理时点、主键与单位。
- 建立数据字典:字段、单位、时区、交易日历、数据源、抓取时间、原始价与复权因子。
- 用(date, code)查重,区分停牌、未上市、窗口不足和真实缺失;不要用向后填充把未来值带回过去。
- 保存原始快照与清洗日志,固定随机种子和环境版本;接口字段变化时先核对官方文档。
使用边界
- 报告期不等于公告可用日,盘后公告通常不能用于当天收盘前决策。
- API输出名为“动态市盈率”时不能直接改名TTM;浏览器练习不支持任意原生库或行情抓取接口。
打开术语词典,随时查阅基础概念。
背景 · 从一个困惑说起
面板数据的长表形态(每行一个「日期×股票」组合)适合存储和groupby——但算横截面排名时需要矩阵视角(每天一行、每列一只股票)。pivot和melt就是两种形态之间的桥梁。
由此产生的问题
pivot怎么把长表变宽表?melt/unstack怎么变回来?两种形态各自适合什么计算?
核心概念
pivot:长→宽——df.pivot(index='date', columns='code', values='close')→日期为行、代码为列的矩阵。逆操作:stack()或melt()把宽表还原为长表。适用分工:宽表适合矩阵运算(rank(axis=1)横截面排名、矩阵乘法组合收益);长表适合存储(省空间)和groupby聚合。实际上panel最常用的是unstack('code')(MultiIndex长表→宽表)而非pivot——效果等价但保留索引信息。
为什么需要它
①横截面操作必须在宽表完成:rank(axis=1)每行跨股票排名——长表做不到;②存储在长表更经济:宽表有大量NaN(停牌/新股)浪费空间;③两者互逆保证信息无损——你可以随时切换形态而不丢数据。
实际应用场景
标准模式:存储用长表→计算时unstack转宽→rank(axis=1)算横截面→stack回长表——一个往返覆盖因子计算的全部形态需求。
与之前知识的联系
q-306(双索引面板)的形态变换;宽表的横截面操作(rank/std on axis=1)回扣q-309(groupby vs unstack的两种路线);q-353(按天横截面排名)在宽表一行搞定。
⚠ 常见误解
- pivot和pivot_table一样:pivot不聚合(有重复索引会报错);pivot_table支持聚合(类似Excel透视表)——面板数据通常用pivot
- 宽表比长表好:各有最佳场景——存储长表、计算宽表;不要只选一边
- melt和stack完全一样:效果等价但接口不同——stack/unstack保留MultiIndex更方便;melt生成普通列
🛠 本题实践任务
对你的面板数据做unstack('code')转宽表——算横截面rank——再stack回来。三种形态各在什么场景用?
💡 提示(先自己想5分钟再看)
宽表适合矩阵运算(rank(axis=1)横截面排名);长表适合groupby聚合。
✅ 验收标准
一次完整的宽→计算→长往返。你的数据形态变换自由。
在你的浏览器内运行。首次需联网下载 Python;支持标准库和 Pyodide 提供的 NumPy、pandas 等包。行情抓取、系统文件访问和部分第三方库请在本地环境运行。输出自检仅比对结果关键词,不代替逻辑审查。
Python · 独立工作线程 · 执行限时10秒
🤖 AI导师
导师会先检查你的前置知识(groupby、DataFrame结构),再用案例、公式和代码帮助理解。此功能需要先启用服务。