第四节:数据基础结构——认识DataFrame
各位同学,欢迎来到数据清洗的第一站。
说实话,很多做量化的人,一上来就急着写策略、跑回测。但我见过太多人,连数据长什么样都没搞清楚,最后回测结果漂亮得不行,实盘一跑就崩。为什么?数据基础没打牢。
这一节,我们就来好好认识一下Pandas里最核心的数据结构——DataFrame。你把它玩明白了,后面所有清洗、分析、建模的工作,都会顺手很多。
4.1 什么是DataFrame?
简单说,DataFrame就是一个表格。像Excel那样,有行有列。
但比Excel强的地方在于:它能存海量数据,处理速度飞快,而且跟Python的生态无缝衔接。我个人习惯把DataFrame想象成一个「智能电子表格」——每一列可以有不同的数据类型,还能做各种复杂的运算。
核心概念:
- 行(row):代表一条记录,比如某只股票某一天的交易数据
- 列(column):代表一个字段,比如开盘价、收盘价、成交量
- 索引(index):行的标签,通常用日期或股票代码
举个例子,我们加载一份美股数据看看:
import pandas as pd
# 读取CSV文件
df = pd.read_csv('aapl_2024.csv')
print(type(df)) # 输出:<class 'pandas.core.frame.DataFrame'>
看到没?df就是一个DataFrame对象。接下来我们就要跟它打交道了。
4.2 查看数据头部与尾部
拿到数据的第一件事是什么?别急着分析,先看一眼数据长什么样。
我一般会用head()和tail()这两个方法。它们就像数据集的「缩略图」,让你快速了解数据的概貌。
# 查看前5行
print(df.head())
# 查看后5行
print(df.tail())
# 也可以指定行数
print(df.head(10)) # 前10行
print(df.tail(3)) # 后3行
为什么要看尾部?因为很多数据集在写入时,最后几行可能是汇总行或者空行。我曾经遇到过一份数据,前100万行都好好的,最后一行突然冒出一个「数据来源:Yahoo Finance」——差点把整个分析带偏。所以,头尾都看一眼,是个好习惯。
4.3 数据维度与列名
看完了头尾,接下来要搞清楚数据有多大。
用shape属性,它会返回一个元组:(行数, 列数)。
print(df.shape)
# 输出示例:(252, 7) —— 252行,7列
252行,正好是一年的交易日数量。7列,通常包括日期、开盘、最高、最低、收盘、成交量、调整收盘价。
那列名是什么?用columns属性:
print(df.columns)
# 输出示例:Index(['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Close'], dtype='object')
嗯,这里要注意一点:列名里有没有空格?有没有大小写不一致?我见过有人把列名写成「Close Price」和「close_price」,结果后面处理时各种报错。所以拿到数据后,我通常会先统一列名格式:全部小写,空格换成下划线。
小技巧:用df.columns.tolist()可以把列名转成列表,方便后续操作。
4.4 数据类型检查
这一步特别重要,但很多人会忽略。
DataFrame里每一列都有自己的数据类型。常见的有:
- int64:整数,比如成交量
- float64:浮点数,比如价格
- object:字符串/文本,比如日期(如果没解析的话)
- datetime64:日期时间类型
用dtypes属性查看:
print(df.dtypes)
# 输出示例:
# Date object
# Open float64
# High float64
# Low float64
# Close float64
# Volume int64
# Adj Close float64
# dtype: object
看到问题了吗?Date列是object类型,不是datetime。这意味着你不能直接用日期做筛选、排序、画图。必须转换:
df['Date'] = pd.to_datetime(df['Date'])
为什么会出现这种情况?因为CSV文件里日期是以字符串形式存储的。Pandas读取时不会自动识别,你得手动告诉它「这一列是日期」。
避坑指南:我曾经处理过一份数据,成交量列显示为float64,但实际值全是整数。后来发现是因为数据里混了几个空值,Pandas自动把整列转成了浮点型。所以,看到类型不对,一定要追查原因。
4.5 描述性统计
最后一步,用describe()方法快速了解数据的分布情况。
print(df.describe())
它会输出每列(数值型)的统计信息:
| 统计量 | 含义 |
|---|---|
| count | 非空值的数量 |
| mean | 平均值 |
| std | 标准差 |
| min | 最小值 |
| 25% | 第一四分位数 |
| 50% | 中位数 |
| 75% | 第三四分位数 |
| max | 最大值 |
举个例子,如果收盘价的min是0.01,那大概率是数据出错了——苹果股票不可能这么便宜。或者如果count比总行数少,说明有缺失值。
我个人习惯在describe()之后,再加一行代码:
print(df.isnull().sum()) # 检查每列有多少缺失值
这样,数据的基本健康状况就一目了然了。
知识体系总览
下面这张图,帮你把这一节的核心逻辑串起来:
这五个步骤,是我每次拿到新数据后必做的「体检套餐」。做完这些,你对数据就有了一个全面的认识,后面再清洗、再分析,心里就有底了。
记住一句话:数据质量决定了策略质量的上限。花10分钟做好数据检查,能省下后面10小时的调试时间。
公众号:蓝海资料掘金营,微信deep3321