一、Pandas简介和安装
Pandas是Python中用于数据处理和数据分析的开源库,2008年由金融数据分析师Wes McKinney开发。开发Pandas的初衷是为了方便进行金融数据分析,现在Pandas的功能越来越丰富,应用范围也越来越广,几乎所有需要做数据处理的地方都可以派上用场。
Pandas基于numpy和matplotlib开发,既具有numpy的高性能数据处理能力,也具有matplotlib的绘图能力。此外,Pandas对numpy和matplotlib的一些方法进行了更高层的封装和扩展,使用起来更方便和快捷,功能也更加强大。
Pandas是第三方库,安装命令如下:
代码语言:javascript复制pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
从本文开始,我会用多篇文章来介绍Pandas的知识点。
二、初始数据准备
Pandas最初是用于金融数据分析的,所以我先获取了一份股票数据(贵州茅台的历史交易数据)。数据来源于网易财经,可以直接下载(能直接下载就不要考虑爬虫了,目的是拿到数据,爬虫还要处理很多反爬)。
数据获取步骤:
1. 进入网易财经首页,站内搜索“贵州茅台”或其股票代码“600519”。
2. 进入贵州茅台的的个股行情页面,向下滚动到“资金流向”显示栏,然后点击右上角的“更多”。
3. 进入资金流向的详情页面后,点击“历史交易数据”,然后点击“下载数据”,即可下载贵州茅台的历史交易数据。其他股票同理。
最终获取数据的链接为:http://quotes.money.163.com/trade/lsjysj_600519.html#01b07
下载下来的数据是一个.csv格式的文本,数据无需处理,可以直接使用,也可以直接用办公软件Excel打开。为了方便后面的代码调用,下载完成后将这个.csv文件拷贝到代码的同级目录下。
三、DataFrame数据结构介绍
1. Pandas读取csv文件中的数据
代码语言:javascript复制# coding=utf-8
import pandas as pd
data = pd.read_csv("600519.csv", encoding='gbk')
print(data)
print(type(data))
下载的数据文件是600519.csv,将此文件放到代码同级目录下,读取的数据结果如下图。下载的数据编码格式是'gbk',所以读取数据时也要指定用'gbk',否则会报错。
使用type()函数打印数据的类型,数据类型为DataFrame。说明刚从csv文件中读取出来的数据是一个DataFrame数据。
代码语言:javascript复制<class 'pandas.core.frame.DataFrame'>
2. DataFrame数据结构的构成
DataFrame数据是Pandas中的基本数据结构,同时具有行索引(index)和列索引(columns),看起来与Excel表格相似。
DataFrame数据由三个部分组成,行索引、列索引、数据。pandas读取DataFrame数据时,如果数据行数和列数很多,会自动将数据折叠,中间的显示为“...”。
与numpy中的ndarray相比,ndarray只有数据部分,没有行索引和列索引,缺少对数据的描述和说明,没有赋予数据实际意义。DataFrame有行索引和列索引,且支持多种索引操作,使数据更贴近真实场景,处理更方便。
四、DataFrame的基本属性
1. DataFrame的行索引index和列索引columns
代码语言:javascript复制data = pd.read_csv("600519.csv", encoding='gbk')
print(data.index)
print(data.columns)
代码语言:javascript复制RangeIndex(start=0, stop=4726, step=1)
Index(['日期', '股票代码', '名称', '收盘价', '最高价', '最低价', '开盘价', '前收盘', '涨跌额', '涨跌幅',
'换手率', '成交量', '成交金额', '总市值', '流通市值'],
dtype='object')
2. DataFrame中的数据values
代码语言:javascript复制data = pd.read_csv("600519.csv", encoding='gbk')
print(data.values)
代码语言:javascript复制[['2021-02-19' "'600519" '贵州茅台' ... 14525164525.0 3090246588000.0
3090246588000.0]
['2021-02-18' "'600519" '贵州茅台' ... 16704135269.0 3104064763800.0
3104064763800.0]
['2021-02-10' "'600519" '贵州茅台' ... 15675929714.0 3267370477800.0
3267370477800.0]
...
['2001-08-29' "'600519" '贵州茅台' ... 194689620.0 9095000000.0 2601170000.0]
['2001-08-28' "'600519" '贵州茅台' ... 463463143.0 9215000000.0 2635490000.0]
['2001-08-27' "'600519" '贵州茅台' ... 1410347179.0 8887500000.0
2541825000.0]]
values只获取DataFrame中的数据,是一个numpy.ndarray对象,即多维数组。
3. DataFrame的形状shape和转置.T
代码语言:javascript复制data = pd.read_csv("600519.csv", encoding='gbk')
print("形状:", data.shape)
data2 = data.T
print("转置后形状:", data2.shape)
代码语言:javascript复制形状:(4726, 15)
转置后形状:(15, 4726)
4. DataFrame中的数据类型
代码语言:javascript复制data = pd.read_csv("600519.csv", encoding='gbk')
print(data.dtypes)
代码语言:javascript复制日期 object
股票代码 object
名称 object
收盘价 float64
最高价 float64
最低价 float64
开盘价 float64
前收盘 float64
涨跌额 object
涨跌幅 object
换手率 float64
成交量 int64
成交金额 float64
总市值 float64
流通市值 float64
dtype: object
与numpy中的ndarray相比,同一个ndarray中的数据类型是一致的,而DataFrame中的每一列数据可以是不同类型的数据。
五、DataFrame部分显示
本文中的数据有四千多行,很多时候,没有必要所有行都显示,只显示一部分即可。
Pandas中实现了两个常用的部分显示方法,head()和tail()。
head(n=5): 显示前5行数据。n可以根据需要传入,如果不传值默认显示5行。
tail(n=5): 显示后5行数据。n同head()。
代码语言:javascript复制data = pd.read_csv("600519.csv", encoding='gbk')
print(data.head())
代码语言:javascript复制 日期 股票代码 名称 ... 成交金额 总市值 流通市值
0 2021-02-19 '600519 贵州茅台 ... 1.452516e 10 3.090247e 12 3.090247e 12
1 2021-02-18 '600519 贵州茅台 ... 1.670414e 10 3.104065e 12 3.104065e 12
2 2021-02-10 '600519 贵州茅台 ... 1.567593e 10 3.267370e 12 3.267370e 12
3 2021-02-09 '600519 贵州茅台 ... 7.972930e 09 3.085762e 12 3.085762e 12
4 2021-02-08 '600519 贵州茅台 ... 8.420759e 09 2.975681e 12 2.975681e 12
[5 rows x 15 columns]
六、DataFrame的索引设置
1. 设置某一列为行索引
上面的DataFrame数据中,行索引是0~4725的整数,假如要设置日期为行索引,可以使用set_index()方法设置。
代码语言:javascript复制data = pd.read_csv("600519.csv", encoding='gbk')
data3 = data.set_index('日期')
print(data3.head())
将日期设置为行索引后,“日期”这一列数据变成了索引,数据中就不再有日期了。可见,set_index()移动了列的位置,从数据移动到了行索引(但没有删除数据)。如果要将某列数据作为行索引,同时数据中也有该列数据,可以在set_index()中指定drop参数为False(set_index()中drop参数默认为True)。
2. 重设索引
修改DataFrame的行索引后,如果要将行索引还原成初始状态,可以使用reset_index()方法还原。
代码语言:javascript复制data4 = data3.reset_index()
print(data4.head())
reset_index()和set_index()是互逆的,不管set_index()将索引修改成了什么,都可以用reset_index()进行还原。如果set_index()中指定了drop参数为False,reset_index()中要将drop参数设置为True(reset_index()中drop参数默认为False,与set_index()相反)。
3. 设置多重索引MultiIndex
使用set_index()设置行索引时可以同时设置多个列为行索引。当一列中的数据不唯一时,可以使用两列或多列来组合成多重行索引,当需要将数据处理成多维数据时,也可以用多重索引。
代码语言:javascript复制data = pd.read_csv("600519.csv", encoding='gbk').head()
data5 = data.set_index(['日期', '股票代码'])
print(data5)
print(data5.index)
可以看到,当同时设置“日期”和“股票代码”为行索引后,打印行索引的结果是MultiIndex(多重索引),而前面打印原始数据的行索引为Index。
以上就是Pandas中DataFrame数据结构的基本介绍。DataFrame是Pandas中最常用的数据结构,大部分方法都是对DataFrame作处理,后面会陆续介绍更多相关的属性和方法。