Skip to content

7.3 pandas入门:DataFrame是什么

课前导读

本节目标

你将学会:把 DataFrame 想成一张“带行号和列名的行情表”,理解行、列、索引、字段的作用。

适合基础:刚学完第 6 章“量化入门”和“数据字段”概念,知道 A 股日线里有开盘价、收盘价、成交量。

预计用时:约 32 分钟。

本节边界:只学习如何看懂和操作小表,不展开因子检验、完整回测系统或实盘工程。


知识正文

1. 先用“菜谱表”理解 DataFrame

如果你第一次听到 DataFrame,不要把它想成高深的数学工具。

你可以先想象一张家庭菜谱表。

每一行是一道菜。

每一列是一种信息,比如菜名、主料、用时、难度。

最左边还有一个行号,方便你说“我要看第 3 道菜”。

这张表不是散乱的文字,而是规整的二维表。

DataFrame 也是这样:它是一张有行、有列、有列名、可计算的表。

在 A 股量化研究里,我们常把一只股票的日线行情放进 DataFrame。

每一行代表一个交易日。

每一列代表一个字段。

比如日期、股票代码、开盘价、最高价、最低价、收盘价、成交量。

第 6 章讲过,量化研究的第一步不是预测未来,而是把投资事实记录成可检查的数据。

DataFrame 就是 pandas 帮我们管理这些“投资事实”的表格工具。

2. 从菜谱表切换到行情表

下面是一张手写的小行情表。

它不是来自外部数据服务,而是为了学习 pandas 人工准备的示例。

行号日期股票代码开盘价收盘价成交量
02026-01-0560000010.0010.201200000
12026-01-0660000010.2010.10980000
22026-01-0760000010.1010.451500000
32026-01-0860000010.4510.301100000

这张表里,行号 0、1、2、3 是默认索引。

“日期”“股票代码”“开盘价”“收盘价”“成交量”是列名,也可以叫字段名。

每个单元格是一条具体记录。

比如第 2 行的收盘价 10.45,表示 2026-01-07 这一天的收盘价。

你可以把 DataFrame 看成“Excel 表格 + Python 计算能力”的组合。

Excel 适合人工查看,pandas 更适合让程序重复筛选、计算和检查。

3. 用代码创建第一张 DataFrame

python
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),屏幕会被刷满。

更稳妥的做法,是先看前几行和表的结构。

python
print(df.head())

print(df.shape)

print(df.columns)

head() 像是翻开资料夹只看第一页。

shape 告诉你有多少行、多少列。

columns 告诉你有哪些字段。

这三个动作很像投资前的“验货”。

你先确认表是不是你以为的那张表,再进入计算。

关键心得

量化研究里,第一眼不要急着算收益,先确认字段、行数、列名和样例记录。

6. 选择一列:像从行情软件里只看“收盘价”

如果你只想看收盘价这一列,可以这样写。

python
close = df["收盘价"]

print(close)

df["收盘价"] 的意思是:从整张表里取出“收盘价”这一列。

这就像你在行情软件里只盯着收盘价,而暂时不看开盘价和成交量。

如果你想同时看日期和收盘价,可以写成列表。

python
date_close = df[["日期", "收盘价"]]

print(date_close)

外层方括号表示“我要从 df 里取列”。

内层方括号表示“我要取不止一列”。

这个细节看起来小,却是新手最容易写错的地方之一。

7. 筛选行:只看满足条件的交易日

投资者经常会问:“哪些交易日收盘价高于 10.20 元?”

DataFrame 可以把这个问题写成条件。

python
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 自动向下比较。

python
df["日收益率"] = df["收盘价"].pct_change()

print(df[["日期", "收盘价", "日收益率"]])

pct_change() 会计算当前值相对上一行的变化比例。

第一行没有上一天可以比较,所以日收益率会是空值。

如果 10.20 变成 10.10,收益率约为 -0.98%。

如果 10.10 变成 10.45,收益率约为 3.47%。

这里我们只是学习计算方法,不把它变成买卖信号。

后续章节会更系统地讨论如何验证规则。

9. DataFrame 的处理流程

下面用 Mermaid 把一个最小 pandas 工作流串起来。

mermaid
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 的交易日。

参考代码如下。

python
active_days = df[df["成交量"] > 1000000]

print(active_days[["日期", "收盘价", "成交量"]])

完成后不要急着解释“为什么上涨”。

先只写一句客观描述:哪些日期成交量超过阈值,收盘价分别是多少。

练习 3:给表格加一列“涨跌方向”

python
df["涨跌方向"] = df["日收益率"].apply(
    lambda value: "上涨" if value > 0 else "下跌或无可比数据"
)

print(df[["日期", "日收益率", "涨跌方向"]])

这段代码把数字变化转成文字标签。

第一行因为没有上一天可比,会被放进“下跌或无可比数据”。

这提醒我们:标签方便阅读,但标签背后仍要理解数据来源。

练习 4:写下你的表格检查清单

请在笔记里写下四个问题。

第一,这张表每一行代表什么?

第二,这张表有哪些字段?

第三,索引现在是什么?

第四,新增列的计算依据是什么?

如果你能回答这四个问题,就已经具备了使用 pandas 读行情表的入门能力。


核心复盘

知识清单

  • [ ] DataFrame 可以理解为“带行号和列名的可计算行情表”。
  • [ ] 行、列、索引、字段必须说清楚,否则后续计算容易错位。
  • [ ] head()shapecolumns 是拿到表格后的基础验货动作。
  • [ ] df["列名"] 用来取一列,df[["列1", "列2"]] 用来取多列。
  • [ ] 条件筛选是把投资想法写成 True/False 的第一步。
  • [ ] pct_change() 可以计算相邻两行的简单变化比例,但结果不等于买卖信号。

金句总结

DataFrame 不是神奇预测器,而是把 A 股数据整理成可检查表格的工作台。

风险提醒

任何基于 DataFrame 的计算都依赖原始数据质量。字段口径、排序、缺失值或单位错误,都会让看似精确的结果变得不可靠。

本文档仅供学习交流用途,不构成任何投资建议。股市有风险,入市需谨慎。