4. Pandas入门(上):Series与DataFrame创建、数据查看与筛选、数据清洗
各位同学,欢迎来到Pandas的世界。说实话,在量化交易这个行当里,Pandas就是我们的瑞士军刀。没有它,你连数据都拿不住,更别提什么策略回测了。今天咱们先打地基,把Series和DataFrame这两个核心数据结构搞明白。
本章核心脉络:从数据结构创建 → 数据查看与筛选 → 数据清洗(缺失值、重复值处理)
4.1 数据结构创建:Series与DataFrame
先说说Series。你可以把它想象成一列带标签的数据,有点像Excel里的一列,但更灵活。我刚开始用Pandas时,总觉得Series有点多余——直接用列表不香吗?后来发现,有了索引标签,做数据对齐简直不要太爽。
import pandas as pd
import numpy as np
# 从列表创建Series
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s)
输出结果会显示索引(左边)和值(右边)。注意那个np.nan,它就是Pandas里的缺失值标记。嗯,这里要记住:Pandas用NaN表示缺失,不是None。
DataFrame就好理解了——它就是个表格。行和列都有标签。我个人习惯用字典来创建DataFrame,因为键名直接变成列名,特别直观。
# 从字典创建DataFrame
df = pd.DataFrame({
'股票代码': ['000001', '000002', '000003'],
'收盘价': [12.5, 8.3, 15.7],
'成交量': [10000, 8500, 12000]
})
print(df)
小技巧:如果你有CSV文件,直接用pd.read_csv('文件路径.csv')就能读进来。我在项目中90%的数据都是这么来的。
4.2 数据查看与筛选
数据创建好了,第一件事就是看看它长什么样。别急着分析,先瞄一眼。
# 查看前5行
print(df.head())
# 查看后3行
print(df.tail(3))
# 查看基本信息
print(df.info())
# 查看统计摘要
print(df.describe())
head()和tail()是我用得最频繁的两个函数。你想想看,每次拿到新数据,我第一反应就是df.head(),确认列名对不对、数据有没有乱码。
筛选数据这块,Pandas提供了两种方式:标签索引(loc)和位置索引(iloc)。
# loc:按标签名筛选
print(df.loc[0]) # 第一行
print(df.loc[:, '收盘价']) # 所有行的'收盘价'列
# iloc:按位置筛选
print(df.iloc[0:2]) # 前两行
print(df.iloc[:, 1:3]) # 第1到第2列
注意:loc的切片是包含结束位置的,而iloc的切片是左闭右开。我曾经因为这个搞错过,查了半天才发现是索引方式的问题。
条件筛选也很常用。比如我只想看收盘价大于10的股票:
# 条件筛选
high_price = df[df['收盘价'] > 10]
print(high_price)
说白了,条件筛选就是给DataFrame一个布尔条件,它自动返回满足条件的行。这个在量化策略里太常用了——筛选出符合条件的股票,然后做进一步分析。
4.3 数据清洗:处理缺失值与重复值
真实数据从来不会干干净净。我遇到过最夸张的情况:一个CSV文件里30%的数据都是缺失的。所以数据清洗是必修课。
4.3.1 处理缺失值
先看看数据里有没有缺失值:
# 检查缺失值
print(df.isnull().sum()) # 每列缺失值数量
print(df.isnull().any()) # 哪些列有缺失
处理缺失值有两种思路:删除或填充。
# 删除包含缺失值的行
df_clean = df.dropna()
# 填充缺失值
df_filled = df.fillna(0) # 用0填充
df_filled_mean = df.fillna(df.mean()) # 用均值填充
df_filled_ffill = df.fillna(method='ffill') # 用前一个值填充
经验之谈:在量化交易中,我一般不用均值填充。因为金融数据有很强的时序性,用前一个值(ffill)或者插值法更合理。比如某天停牌导致数据缺失,用前一天的收盘价填充就很自然。
4.3.2 处理重复值
重复数据也是个麻烦事。有时候是数据源的问题,有时候是合并数据时搞出来的。
# 检查重复行
print(df.duplicated().sum())
# 删除重复行
df_unique = df.drop_duplicates()
# 按指定列判断重复
df_unique_subset = df.drop_duplicates(subset=['股票代码'])
我曾经在回测时发现收益率曲线特别漂亮,结果一查,原来是数据里有重复行,把同一笔交易算了两次。嗯,从那以后我每次做回测前都会先跑一遍drop_duplicates()。
| 方法 | 用途 | 常用参数 |
|---|---|---|
| isnull() | 检测缺失值 | 无 |
| dropna() | 删除缺失值 | axis, how, thresh |
| fillna() | 填充缺失值 | value, method, axis |
| duplicated() | 检测重复值 | subset, keep |
| drop_duplicates() | 删除重复值 | subset, keep, inplace |
避坑指南:使用inplace=True时要小心。它直接修改原DataFrame,不会返回新对象。我建议先用inplace=False(默认)测试,确认没问题再改原数据。
好了,今天的内容就到这里。Series和DataFrame的创建、数据查看筛选、以及缺失值和重复值的处理,这些都是Pandas最基础的操作。别小看这些基础,我做了这么多年量化,每天还在用这些函数。下一章咱们会深入Pandas的高级操作,包括数据合并、分组聚合这些更强大的功能。