7.3 pandas入门:DataFrame是什么
课前导读
本节目标
你将学会:把 DataFrame 想成一张“带行号和列名的行情表”,理解行、列、索引、字段的作用。
适合基础:刚学完第 6 章“量化入门”和“数据字段”概念,知道 A 股日线里有开盘价、收盘价、成交量。
预计用时:约 32 分钟。
本节边界:只学习如何看懂和操作小表,不展开因子检验、完整回测系统或实盘工程。
知识正文
1. 先用“菜谱表”理解 DataFrame
如果你第一次听到 DataFrame,不要把它想成高深的数学工具。
你可以先想象一张家庭菜谱表。
每一行是一道菜。
每一列是一种信息,比如菜名、主料、用时、难度。
最左边还有一个行号,方便你说“我要看第 3 道菜”。
这张表不是散乱的文字,而是规整的二维表。
DataFrame 也是这样:它是一张有行、有列、有列名、可计算的表。
在 A 股量化研究里,我们常把一只股票的日线行情放进 DataFrame。
每一行代表一个交易日。
每一列代表一个字段。
比如日期、股票代码、开盘价、最高价、最低价、收盘价、成交量。
第 6 章讲过,量化研究的第一步不是预测未来,而是把投资事实记录成可检查的数据。
DataFrame 就是 pandas 帮我们管理这些“投资事实”的表格工具。
2. 从菜谱表切换到行情表
下面是一张手写的小行情表。
它不是来自外部数据服务,而是为了学习 pandas 人工准备的示例。
| 行号 | 日期 | 股票代码 | 开盘价 | 收盘价 | 成交量 |
|---|---|---|---|---|---|
| 0 | 2026-01-05 | 600000 | 10.00 | 10.20 | 1200000 |
| 1 | 2026-01-06 | 600000 | 10.20 | 10.10 | 980000 |
| 2 | 2026-01-07 | 600000 | 10.10 | 10.45 | 1500000 |
| 3 | 2026-01-08 | 600000 | 10.45 | 10.30 | 1100000 |
这张表里,行号 0、1、2、3 是默认索引。
“日期”“股票代码”“开盘价”“收盘价”“成交量”是列名,也可以叫字段名。
每个单元格是一条具体记录。
比如第 2 行的收盘价 10.45,表示 2026-01-07 这一天的收盘价。
你可以把 DataFrame 看成“Excel 表格 + Python 计算能力”的组合。
Excel 适合人工查看,pandas 更适合让程序重复筛选、计算和检查。
3. 用代码创建第一张 DataFrame
import pandas as pd
data = {
"日期": ["2026-01-05", "2026-01-06", "2026-01-07", "2026-01-08"],
"股票代码": ["600000", "600000", "600000", "600000"],
"开盘价": [10.00, 10.20, 10.10, 10.45],
"收盘价": [10.20, 10.10, 10.45, 10.30],
"成交量": [1200000, 980000, 1500000, 1100000],
}
df = pd.DataFrame(data)
print(df)这段代码做了三件事。
第一,import pandas as pd 是把 pandas 工具箱拿到桌面上。
第二,data 是一份手写的小表原料。
第三,pd.DataFrame(data) 把这些原料整理成真正的 DataFrame。
df 是 DataFrame 的常见变量名,意思是“这是一张表”。
对于零基础同学,先不要纠结 pandas 内部怎么实现。
你只要记住:DataFrame 是量化研究里最常见的数据容器。
4. 行、列、索引、字段分别是什么
在投资研究中,词语要说清楚,否则很容易把数据用错。
| 名称 | 通俗理解 | A 股例子 | 常见误区 |
|---|---|---|---|
| 行 | 表格里横着的一条记录 | 某只股票某个交易日 | 以为每行一定代表一天,其实也可能代表一只股票 |
| 列 | 表格里竖着的一类信息 | 收盘价、成交量 | 只看列名,不确认单位 |
| 索引 | 查找行的标签 | 默认行号或日期 | 把索引当成普通列,导致筛选混乱 |
| 字段 | 有明确含义的数据列 | 开盘价、最高价、换手率 | 字段口径不清就直接计算 |
如果一张表里每行是一只股票,每列是 PE、PB、行业,那它是截面表。
如果一张表里每行是一个交易日,每列是开高低收和成交量,那它是时间序列表。
本节先看单只股票的日线表。
后面学习日期索引时,我们会把“日期”变成索引。
5. 看前几行:不要一上来就全表打印
真实 A 股数据可能有几千行。
如果你一上来 print(df),屏幕会被刷满。
更稳妥的做法,是先看前几行和表的结构。
print(df.head())
print(df.shape)
print(df.columns)head() 像是翻开资料夹只看第一页。
shape 告诉你有多少行、多少列。
columns 告诉你有哪些字段。
这三个动作很像投资前的“验货”。
你先确认表是不是你以为的那张表,再进入计算。
关键心得
量化研究里,第一眼不要急着算收益,先确认字段、行数、列名和样例记录。
6. 选择一列:像从行情软件里只看“收盘价”
如果你只想看收盘价这一列,可以这样写。
close = df["收盘价"]
print(close)df["收盘价"] 的意思是:从整张表里取出“收盘价”这一列。
这就像你在行情软件里只盯着收盘价,而暂时不看开盘价和成交量。
如果你想同时看日期和收盘价,可以写成列表。
date_close = df[["日期", "收盘价"]]
print(date_close)外层方括号表示“我要从 df 里取列”。
内层方括号表示“我要取不止一列”。
这个细节看起来小,却是新手最容易写错的地方之一。
7. 筛选行:只看满足条件的交易日
投资者经常会问:“哪些交易日收盘价高于 10.20 元?”
DataFrame 可以把这个问题写成条件。
strong_days = df[df["收盘价"] > 10.20]
print(strong_days)这行代码可以拆开理解。
df["收盘价"] > 10.20 会得到一组“是/否”判断。
收盘价大于 10.20 的行是 True。
收盘价不大于 10.20 的行是 False。
外层 df[...] 会把 True 对应的行留下来。
这就是量化思维里的“可检查规则”。
规则不是“感觉走势不错”,而是“收盘价是否大于 10.20”。
常见误区
筛选结果只能说明历史样本中哪些行满足条件,不能说明这些股票未来一定上涨。
8. 新增一列:计算简单收益率
第 6 章已经讲过简单收益率。
它的直觉是:今天相对昨天涨了多少比例。
用收盘价计算日收益率,可以让 pandas 自动向下比较。
df["日收益率"] = df["收盘价"].pct_change()
print(df[["日期", "收盘价", "日收益率"]])pct_change() 会计算当前值相对上一行的变化比例。
第一行没有上一天可以比较,所以日收益率会是空值。
如果 10.20 变成 10.10,收益率约为 -0.98%。
如果 10.10 变成 10.45,收益率约为 3.47%。
这里我们只是学习计算方法,不把它变成买卖信号。
后续章节会更系统地讨论如何验证规则。
9. DataFrame 的处理流程
下面用 Mermaid 把一个最小 pandas 工作流串起来。
graph TD
A["准备手写行情数据"] --> B["创建 DataFrame"]
B --> C["检查行数与字段"]
C --> D["筛选需要的列"]
D --> E["按条件筛选交易日"]
E --> F["新增收益率列"]
F --> G["记录你的观察结论"]这个流程和投资复盘很像。
先拿到资料,再确认资料,再做计算,最后写结论。
如果中间跳过“检查字段”这一步,后面的结论就可能建立在错误数据上。
10. A 股案例:同一张表,不同角色看什么
专业老师会关注:你是否能说清楚每一列是什么。
投资者会关注:价格变化和成交量变化是否符合自己的观察。
量化开发会关注:字段名称是否稳定、数据类型是否正确、计算步骤是否可重复。
比如同样看到“收盘价上涨、成交量放大”。
投资者可能说:“这一天市场参与更活跃。”
量化开发会继续问:“成交量单位是股还是手?日期是否已经排序?有没有停牌日?”
这不是抬杠,而是为了避免把错误数据写进规则。
DataFrame 的价值就在这里。
它让我们把“看盘感觉”拆成可以检查的表格动作。
11. 本节不做什么
本节不会教你用 DataFrame 找“必涨股票”。
本节不会展开完整回测系统。
本节也不会讨论复杂因子组合。
你现在只需要建立一个基本能力:看到行情表,知道行、列、索引、字段和新增计算列分别是什么。
这个能力看似朴素,却是后面所有量化研究的地基。
交互实验室
练习 1:亲手改一行数据
把上面的代码复制到本地 Python 环境。
先运行一次,观察 df.head() 的输出。
然后把 2026-01-08 的收盘价从 10.30 改成 10.60。
再次运行日收益率计算。
请回答:最后一行的日收益率方向有没有变化?
练习 2:写一个筛选条件
请筛选出成交量大于 1,000,000 的交易日。
参考代码如下。
active_days = df[df["成交量"] > 1000000]
print(active_days[["日期", "收盘价", "成交量"]])完成后不要急着解释“为什么上涨”。
先只写一句客观描述:哪些日期成交量超过阈值,收盘价分别是多少。
练习 3:给表格加一列“涨跌方向”
df["涨跌方向"] = df["日收益率"].apply(
lambda value: "上涨" if value > 0 else "下跌或无可比数据"
)
print(df[["日期", "日收益率", "涨跌方向"]])这段代码把数字变化转成文字标签。
第一行因为没有上一天可比,会被放进“下跌或无可比数据”。
这提醒我们:标签方便阅读,但标签背后仍要理解数据来源。
练习 4:写下你的表格检查清单
请在笔记里写下四个问题。
第一,这张表每一行代表什么?
第二,这张表有哪些字段?
第三,索引现在是什么?
第四,新增列的计算依据是什么?
如果你能回答这四个问题,就已经具备了使用 pandas 读行情表的入门能力。
核心复盘
知识清单:
- [ ] DataFrame 可以理解为“带行号和列名的可计算行情表”。
- [ ] 行、列、索引、字段必须说清楚,否则后续计算容易错位。
- [ ]
head()、shape、columns是拿到表格后的基础验货动作。 - [ ]
df["列名"]用来取一列,df[["列1", "列2"]]用来取多列。 - [ ] 条件筛选是把投资想法写成 True/False 的第一步。
- [ ]
pct_change()可以计算相邻两行的简单变化比例,但结果不等于买卖信号。
金句总结
DataFrame 不是神奇预测器,而是把 A 股数据整理成可检查表格的工作台。
风险提醒
任何基于 DataFrame 的计算都依赖原始数据质量。字段口径、排序、缺失值或单位错误,都会让看似精确的结果变得不可靠。