4. Pandas基础:Series与DataFrame的创建、数据读取与预览
做量化分析,说白了就是跟数据打交道。而Pandas,就是咱们手里最顺手的工具。我刚开始接触量化的时候,面对一堆CSV文件,头都是大的。后来发现,只要把Pandas的Series和DataFrame搞明白,后面的事情就顺了。
这一章,咱们就聊聊这两个核心数据结构。别怕,其实很简单。
4.1 认识Series:一维数据的好帮手
Series,你可以把它想象成一个带标签的列表。每个数据都有一个对应的索引,就像Excel里的一列数据,但比那灵活多了。
创建Series
最直接的方式,就是从列表创建:
import pandas as pd
# 从列表创建Series
s = pd.Series([100, 200, 300, 400, 500])
print(s)
输出结果会显示索引(左边)和值(右边)。默认索引是从0开始的整数。
但咱们做机构持仓分析,索引往往是有意义的。比如用股票代码做索引:
# 指定索引
s = pd.Series([100, 200, 300], index=['000001.SZ', '600001.SH', '300001.SZ'])
print(s)
从字典创建
字典的键会自动变成索引:
# 从字典创建
data = {'贵州茅台': 1850.50, '五粮液': 168.20, '泸州老窖': 220.30}
s = pd.Series(data)
print(s)
嗯,这里要注意:字典是无序的,但Series会保持你传入的顺序。
4.2 DataFrame:二维表格的核心
DataFrame才是咱们真正的主力。它就像一张Excel表格,有行有列。每一列可以看作一个Series。
创建DataFrame
最常用的方式是从字典创建,每个键是一列:
# 创建DataFrame
data = {
'股票代码': ['000001.SZ', '600001.SH', '300001.SZ'],
'股票名称': ['平安银行', '浦发银行', '宁德时代'],
'收盘价': [12.50, 8.30, 450.00],
'持仓市值': [1250000, 830000, 45000000]
}
df = pd.DataFrame(data)
print(df)
你看,这样数据就结构化了。每一行是一只股票,每一列是一个属性。
从列表嵌套创建
有时候数据是从API接口拿到的,是列表嵌套列表的形式:
# 从列表嵌套创建
data = [
['000001.SZ', '平安银行', 12.50],
['600001.SH', '浦发银行', 8.30],
['300001.SZ', '宁德时代', 450.00]
]
df = pd.DataFrame(data, columns=['股票代码', '股票名称', '收盘价'])
print(df)
4.3 数据读取:CSV和Excel
实际工作中,数据很少手动输入。大部分是从CSV或Excel文件读取的。
读取CSV文件
这是最常用的方式。机构持仓数据很多都是CSV格式:
# 读取CSV文件
df = pd.read_csv('fund_holdings.csv')
print(df.head())
但CSV文件经常有坑。我曾经遇到过编码问题,文件明明是UTF-8编码,但读出来全是乱码。后来我养成了一个习惯:
# 指定编码,避免乱码
df = pd.read_csv('fund_holdings.csv', encoding='utf-8')
# 如果还不行,试试gbk
# df = pd.read_csv('fund_holdings.csv', encoding='gbk')
skip_blank_lines=True 就能解决。另外,如果文件里有注释行,可以用 comment='#' 跳过。
读取Excel文件
有些数据源喜欢用Excel格式。读取Excel需要安装 openpyxl 或 xlrd 库:
# 读取Excel文件
df = pd.read_excel('fund_holdings.xlsx', sheet_name='Sheet1')
print(df.head())
Excel文件里经常有多个sheet。我一般会先看看有哪些sheet:
# 查看所有sheet名称
xls = pd.ExcelFile('fund_holdings.xlsx')
print(xls.sheet_names)
4.4 数据预览与基本信息查看
数据读进来了,第一件事不是急着分析,而是先看看数据长什么样。
查看前几行
# 查看前5行
print(df.head())
# 查看后5行
print(df.tail())
# 指定行数
print(df.head(10))
查看基本信息
# 查看数据信息
print(df.info())
info() 会告诉你:有多少行、多少列、每列的数据类型、有没有缺失值。这个函数我几乎每天都会用。
查看统计摘要
# 查看数值列的统计信息
print(df.describe())
这会显示每列的数量、均值、标准差、最小值、最大值等。对于发现异常值很有帮助。
df.info() 和 df.describe()。如果发现某列的数据类型不对(比如日期列显示为object),或者数值范围明显异常,我会先处理这些问题,再往下走。
查看列名和索引
# 查看列名
print(df.columns)
# 查看索引
print(df.index)
# 查看数据形状
print(df.shape)
shape 返回一个元组 (行数, 列数)。比如 (1000, 10) 表示1000行10列。
4.5 知识体系总览
为了让你更直观地理解这一章的内容,我画了一张图:
这张图把这一章的知识点串起来了。从数据结构(Series和DataFrame)出发,到数据读取(CSV和Excel),再到数据预览(head、info、describe等),最后是创建方式和常用操作。你想想看,是不是一目了然?
4.6 实战小贴士
最后,分享几个我在项目中积累的小经验:
- 数据读取后先检查:用
df.info()看看有没有缺失值,数据类型对不对。我遇到过日期列被读成字符串的情况,后面做时间序列分析时才发现,浪费了不少时间。 - 列名规范化:CSV文件里的列名可能有空格、特殊字符。我习惯用
df.columns = df.columns.str.strip()去掉空格,再用df.rename()改成统一的命名风格。 - 大文件处理:如果CSV文件很大(比如几百万行),用
pd.read_csv('file.csv', chunksize=10000)分块读取,避免内存溢出。 - Excel多sheet:如果Excel文件有多个sheet,用
pd.read_excel('file.xlsx', sheet_name=None)一次性读取所有sheet,返回一个字典。
read_csv 和 read_excel。数据预览用 head()、info()、describe()。这些是Pandas最基础的操作,也是后续所有分析工作的起点。
好了,这一章的内容就到这里。记住,Pandas就像一把瑞士军刀,Series和DataFrame就是最常用的两个刀片。多用几次,自然就熟练了。