Pandas 是基于 Numpy 构建的,让以 Numpy 为中心的应用变得更加简单
Pandas 提供了大量快速便捷地处理数据的函数和方法,这也是使 Pandas 成为强大的高效的数据分析环境的重要因素之一
Pandas 的数据结构主要有三种
- Series
- DataFrame
- Panel
一维数组 Series
Series 是由一组数据(各种 Numpy 数据类型),以及一组与之相关的标签数据(即索引)组成。仅上一组数据即可产生最简单的 Series,也可以通过传递一个 list 对象来创建一个 Series 。需要注意的是,Pandas 会默认创建整形索引
Series 中只允许在座相同类型的数据,以提高运算效率
# 引用 pandas 库,并重命名为 pd
import pandas as pd
pd_series = pd.Series(['Python','C','C#','C++','Java','VB','VC'])
print("显示Series中的内容\n", pd_series)
print("显示Series中的索引\n", pd_series.index)
print("显示Series中的数据\n", pd_series.values)
# 创建带指定索引的Serices
other_series = pd.Series(['Python','C','C#','C++','Java','VB','VC'], index = ['a','b','c','d','e','f','g'])
print("显示Series中的内容\n:", other_series)
显示Series中的内容
0 Python
1 C
2 C#
3 C++
4 Java
5 VB
6 VC
dtype: object
显示Series中的索引
Int64Index([0, 1, 2, 3, 4, 5, 6], dtype='int64')
显示Series中的数据
['Python' 'C' 'C#' 'C++' 'Java' 'VB' 'VC']
显示Series中的内容:
a Python
b C
c C#
d C++
e Java
f VB
g VC
dtype: object
二维数组 DataFrame
DataFrame 是一个表格型数据结构,它含有一组有序的列,每一列的数据结构都是相同的,而不同列之间则可以是不同的数据类型。或者以数据库进行类型,DataFrame 中的每一行是一个记录,名称为 Index 的一个元素,而每一列则为一个字段,是这个记录的一个属性。DataFrame 既有行的索引也有列的索引,可以被看作由 Series 组成的字典(共用一个索引)
DataFrame 是个二维数组,相当于表结构。它的列称为columns,行称为index。也可以将DataFrame理解为Series的容器
创建 DataFrame
# 引用 pandas 库,并重命名为 pd
import pandas as pd
data = {"name":["yahoo", "google", "facebook"], "marks": [200,400,800], "price": [9, 3, 7]}
pd_dataframe = pd.DataFrame(data)
print("显示DataFrame的数据")
print(pd_dataframe)
显示DataFrame的数据
marks name price
0 200 yahoo 9
1 400 google 3
2 800 facebook 7
提示,因为字典是无序的,所以最后转换成DataFrame后,列的顺序可能与定义的时候是不一样的
查看数据
先利用get_price
函数来获取某股票一段时间内的数据,其语法如下:
get_price(security, start_date=None, end_date=None, frequency='daily', fields=None, skip_paused=False, fq='pre', count=None)
参数解析:
-
security
:一只股票的代码或一组股票代码的 list -
start_date
: 开始时间,与参数count
二选一,不可同时使用。如果两者都没有设置,则start_date
生效,默认时间为'2015-01-01'。如果取分钟数据,时间可以精确到分钟 -
end_date
: 结束时间,默认是'2015-12-31',包含此日期。当取分钟数据时,如果只有日期,则日内时间等同于'00:00:00',所以返回的数据不包括 end_date 这一天 -
frequency
: 单位时间长度,几天或者几分钟,默认是 daily ,即表示1天。现在支持- Xd 几天
- Xm 几分钟
- daily 1天
- minute 1分钟
需要注意的是,当X>1时,fields 只支持 ['open', 'close', 'high', 'low', 'volume', 'money'] 这几个标准字段
-
fields
: 字符串 list,选择要获取的行情数据字段,默认是 None(表示 ['open', 'close', 'high', 'low', 'volume', 'money'] 这几个标准字段)。参数 felids 支持 SecurityUnitData 里面的所有基本属性,包含:['open', 'close', 'high', 'low', 'volume', 'money', 'factor', 'high_limit', 'low_limit', 'avg', 'pre_close', 'paused'] -
sikp_paused
:是否跳过不易日期(包括停牌、未上市或者退市后数据者为 nan。需要注意的是,该参数默认为 False ,即不跳过不交易日期。如果当该参数是 True 时,只能选取一只股票的信息 -
fq
: 复权选项。参数值设为 'pre',表示前复权,为默认设置;参数值为 None,表示不复权,返回实际价格;参数值设置为 'post',表示后复权 -
count
:与 start_date 二选一,不可同时使用。参数 count 表示数量,返回结果集的行数,表示获取 end_date 之前几个 frequency 的数据
示例代码:
# 引用 pandas 库,并重命名为 pd
import pandas as pd
# 通过get_price函数获取一段时间内某股票的数据
date_frame = get_price('000009.XSHE',
start_date='2018-04-03',
end_date='2018-04-20', frequency='daily')
date_frame
open | close | high | low | volume | money | |
---|---|---|---|---|---|---|
2018-04-03 | 5.97 | 6.17 | 6.20 | 5.88 | 32328739 | 1.964467e+08 |
2018-04-04 | 6.14 | 6.24 | 6.30 | 6.12 | 28622962 | 1.778433e+08 |
2018-04-09 | 6.24 | 6.33 | 6.33 | 6.15 | 29313979 | 1.832740e+08 |
2018-04-10 | 6.32 | 6.26 | 6.33 | 6.16 | 25122114 | 1.565214e+08 |
2018-04-11 | 6.27 | 6.21 | 6.27 | 6.20 | 13808473 | 8.598230e+07 |
2018-04-12 | 6.23 | 6.24 | 6.28 | 6.17 | 17397725 | 1.082082e+08 |
2018-04-13 | 6.23 | 6.11 | 6.27 | 6.09 | 17134280 | 1.056886e+08 |
2018-04-16 | 6.26 | 6.26 | 6.48 | 6.22 | 35419584 | 2.233821e+08 |
2018-04-17 | 6.26 | 6.01 | 6.26 | 6.01 | 23077057 | 1.411712e+08 |
2018-04-18 | 6.05 | 6.09 | 6.12 | 5.90 | 14690685 | 8.846467e+07 |
2018-04-19 | 6.06 | 6.08 | 6.23 | 6.06 | 13842257 | 8.486182e+07 |
2018-04-20 | 6.04 | 5.98 | 6.11 | 5.95 | 12086284 | 7.270285e+07 |
另外date_frame.head()
可以只显示前五行数据:
# 引用 pandas 库,并重命名为 pd
import pandas as pd
# 通过get_price函数获取一段时间内某股票的数据
date_frame = get_price('000009.XSHE',
start_date='2018-04-03',
end_date='2018-04-20', frequency='daily')
date_frame.head()
open | close | high | low | volume | money | |
---|---|---|---|---|---|---|
2018-04-03 | 5.97 | 6.17 | 6.20 | 5.88 | 32328739 | 1.964467e+08 |
2018-04-04 | 6.14 | 6.24 | 6.30 | 6.12 | 28622962 | 1.778433e+08 |
2018-04-09 | 6.24 | 6.33 | 6.33 | 6.15 | 29313979 | 1.832740e+08 |
2018-04-10 | 6.32 | 6.26 | 6.33 | 6.16 | 25122114 | 1.565214e+08 |
2018-04-11 | 6.27 | 6.21 | 6.27 | 6.20 | 13808473 | 8.598230e+07 |
显示最后五行数据,可以使用date_frame.tail()
# 引用 pandas 库,并重命名为 pd
import pandas as pd
# 通过get_price函数获取一段时间内某股票的数据
date_frame = get_price('000009.XSHE',
start_date='2018-04-03',
end_date='2018-04-20', frequency='daily')
date_frame.tail()
open | close | high | low | volume | money | |
---|---|---|---|---|---|---|
2018-04-16 | 6.26 | 6.26 | 6.48 | 6.22 | 35419584 | 2.233821e+08 |
2018-04-17 | 6.26 | 6.01 | 6.26 | 6.01 | 23077057 | 1.411712e+08 |
2018-04-18 | 6.05 | 6.09 | 6.12 | 5.90 | 14690685 | 8.846467e+07 |
2018-04-19 | 6.06 | 6.08 | 6.23 | 6.06 | 13842257 | 8.486182e+07 |
2018-04-20 | 6.04 | 5.98 | 6.11 | 5.95 | 12086284 | 7.270285e+07 |
选择数据
只显示开盘价(open)的数据信息,如下:
# 引用 pandas 库,并重命名为 pd
import pandas as pd
# 通过get_price函数获取一段时间内某股票的数据
date_frame = get_price('000009.XSHE',
start_date='2018-04-03',
end_date='2018-04-20', frequency='daily')
date_frame['open']
2018-04-03 5.97
2018-04-04 6.14
2018-04-09 6.24
2018-04-10 6.32
2018-04-11 6.27
2018-04-12 6.23
2018-04-13 6.23
2018-04-16 6.26
2018-04-17 6.26
2018-04-18 6.05
2018-04-19 6.06
2018-04-20 6.04
Name: open, dtype: float64
选择多个字段,如下:
# 引用 pandas 库,并重命名为 pd
import pandas as pd
# 通过get_price函数获取一段时间内某股票的数据
date_frame = get_price('000009.XSHE',
start_date='2018-04-03',
end_date='2018-04-20', frequency='daily')
date_frame[['open', 'close', 'money']] # 开盘价、收盘价、成交额
open | close | money | |
---|---|---|---|
2018-04-03 | 5.97 | 6.17 | 1.964467e+08 |
2018-04-04 | 6.14 | 6.24 | 1.778433e+08 |
2018-04-09 | 6.24 | 6.33 | 1.832740e+08 |
2018-04-10 | 6.32 | 6.26 | 1.565214e+08 |
2018-04-11 | 6.27 | 6.21 | 8.598230e+07 |
2018-04-12 | 6.23 | 6.24 | 1.082082e+08 |
2018-04-13 | 6.23 | 6.11 | 1.056886e+08 |
2018-04-16 | 6.26 | 6.26 | 2.233821e+08 |
2018-04-17 | 6.26 | 6.01 | 1.411712e+08 |
2018-04-18 | 6.05 | 6.09 | 8.846467e+07 |
2018-04-19 | 6.06 | 6.08 | 8.486182e+07 |
2018-04-20 | 6.04 | 5.98 | 7.270285e+07 |
显示第四条到第六条信息
# 引用 pandas 库,并重命名为 pd
import pandas as pd
# 通过get_price函数获取一段时间内某股票的数据
date_frame = get_price('000009.XSHE',
start_date='2018-04-03',
end_date='2018-04-20', frequency='daily')
date_frame[3:6]
open | close | high | low | volume | money | |
---|---|---|---|---|---|---|
2018-04-10 | 6.32 | 6.26 | 6.33 | 6.16 | 25122114 | 1.565214e+08 |
2018-04-11 | 6.27 | 6.21 | 6.27 | 6.20 | 13808473 | 8.598230e+07 |
2018-04-12 | 6.23 | 6.24 | 6.28 | 6.17 | 17397725 | 1.082082e+08 |
使用标签选取数据,语法如下:
date_frame.loc[行标签, 列标签]
# 选择a行到b行
date_frame.loc['a':'b']
# 选择open列的所有数据
date_frame.loc[:, 'open']
可以看出,第一个参数表示行标签,逗号后的第二个参数表示的是列标签,当然,如果没有第二个参数的话则选择所有列
两个参数既可以是列表,也可以是单个字符,如果两个参数都为列表,则返回的是DataFrame,否则返回Series
loc为location缩写
选择某一天的数据
# 引用 pandas 库,并重命名为 pd
import pandas as pd
# 通过get_price函数获取一段时间内某股票的数据
date_frame = get_price('000009.XSHE',
start_date='2018-04-03',
end_date='2018-04-20', frequency='daily')
date_frame.loc['2018-04-10']
open 6.320000e+00
close 6.260000e+00
high 6.330000e+00
low 6.160000e+00
volume 2.512211e+07
money 1.565214e+08
Name: 2018-04-10 00:00:00, dtype: float64
选择某一天的收盘价数据
# 引用 pandas 库,并重命名为 pd
import pandas as pd
# 通过get_price函数获取一段时间内某股票的数据
date_frame = get_price('000009.XSHE',
start_date='2018-04-03',
end_date='2018-04-20', frequency='daily')
date_frame.loc['2018-04-10', 'close']
6.2599999999999998
选择某一时间段的收盘价数据
# 引用 pandas 库,并重命名为 pd
import pandas as pd
# 通过get_price函数获取一段时间内某股票的数据
date_frame = get_price('000009.XSHE',
start_date='2018-04-03',
end_date='2018-04-20', frequency='daily')
date_frame.loc['2018-04-10':'2018-04-18', 'close']
2018-04-10 6.26
2018-04-11 6.21
2018-04-12 6.24
2018-04-13 6.11
2018-04-16 6.26
2018-04-17 6.01
2018-04-18 6.09
Name: close, dtype: float64
选择所有日期下的收盘价数据
# 引用 pandas 库,并重命名为 pd
import pandas as pd
# 通过get_price函数获取一段时间内某股票的数据
date_frame = get_price('000009.XSHE',
start_date='2018-04-03',
end_date='2018-04-20', frequency='daily')
date_frame.loc[:, 'close']
2018-04-03 6.17
2018-04-04 6.24
2018-04-09 6.33
2018-04-10 6.26
2018-04-11 6.21
2018-04-12 6.24
2018-04-13 6.11
2018-04-16 6.26
2018-04-17 6.01
2018-04-18 6.09
2018-04-19 6.08
2018-04-20 5.98
Name: close, dtype: float64
使用位置选取数据,语法如下:
df.iloc[行位置, 列位置]
# 选取第二行,第二列的值,返回的为单个值
df.iloc[1, 1]
# 选取第一行及第三行的数据(包含第三行)
df.iloc[[0, 2], :]
# 选取第一行到第三行的数据(不包含第三行)
df.iloc[0:2, :]
# 选取所有记录的第二列值,返回的为 Series
df.iloc[:, 1]
# 选取第一行数据,返回为 Series
df.iloc[0, :]
iloc 是 integer 与 location 的缩写
显示第三行第四列的值
# 引用 pandas 库,并重命名为 pd
import pandas as pd
# 通过get_price函数获取一段时间内某股票的数据
date_frame = get_price('000009.XSHE',
start_date='2018-04-03',
end_date='2018-04-20', frequency='daily')
date_frame.iloc[2,3]
6.1500000000000004
更广义的切片方式是使用.ix
,它自动根据给到的索引类型判断是使用位置还是标签进行切片,语法如下:
df.ix[1,1]
df.ix['a':'b']
显示第二行的开盘价
# 引用 pandas 库,并重命名为 pd
import pandas as pd
# 通过get_price函数获取一段时间内某股票的数据
date_frame = get_price('000009.XSHE',
start_date='2018-04-03',
end_date='2018-04-20', frequency='daily')
date_frame.ix[1,'open']
6.1399999999999997
通过逻辑指针进行数据切片,语法如下:
df[逻辑条件]
df[df.one >= 2] # 单个逻辑条件
df[(df.one >=1) & (df.one < 3)] # 多个逻辑条件组合
显示收盘价大于6.25的数据信息
# 引用 pandas 库,并重命名为 pd
import pandas as pd
# 通过get_price函数获取一段时间内某股票的数据
date_frame = get_price('000009.XSHE',
start_date='2018-04-03',
end_date='2018-04-20', frequency='daily')
date_frame[date_frame.close > 6.25]
open | close | high | low | volume | money | |
---|---|---|---|---|---|---|
2018-04-09 | 6.24 | 6.33 | 6.33 | 6.15 | 29313979 | 1.832740e+08 |
2018-04-10 | 6.32 | 6.26 | 6.33 | 6.16 | 25122114 | 1.565214e+08 |
2018-04-16 | 6.26 | 6.26 | 6.48 | 6.22 | 35419584 | 2.233821e+08 |
显示收盘价大于6.25并且成交量小于26000000的数据信息
# 引用 pandas 库,并重命名为 pd
import pandas as pd
# 通过get_price函数获取一段时间内某股票的数据
date_frame = get_price('000009.XSHE',
start_date='2018-04-03',
end_date='2018-04-20', frequency='daily')
date_frame[(date_frame.close > 6.25) & (date_frame.volume < 26000000)]
open | close | high | low | volume | money | |
---|---|---|---|---|---|---|
2018-04-10 | 6.32 | 6.26 | 6.33 | 6.16 | 25122114 | 1.565214e+08 |
使用条件更改数据,如将大于6.25的数据都改为0
# 引用 pandas 库,并重命名为 pd
import pandas as pd
# 通过get_price函数获取一段时间内某股票的数据
date_frame = get_price('000009.XSHE',
start_date='2018-04-03',
end_date='2018-04-20', frequency='daily')
date_frame[(date_frame.close > 6.25)] = 0
date_frame
open | close | high | low | volume | money | |
---|---|---|---|---|---|---|
2018-04-03 | 5.97 | 6.17 | 6.20 | 5.88 | 32328739 | 1.964467e+08 |
2018-04-04 | 6.14 | 6.24 | 6.30 | 6.12 | 28622962 | 1.778433e+08 |
2018-04-09 | 0.00 | 0.00 | 0.00 | 0.00 | 0 | 0.000000e+00 |
2018-04-10 | 0.00 | 0.00 | 0.00 | 0.00 | 0 | 0.000000e+00 |
2018-04-11 | 6.27 | 6.21 | 6.27 | 6.20 | 13808473 | 8.598230e+07 |
2018-04-12 | 6.23 | 6.24 | 6.28 | 6.17 | 17397725 | 1.082082e+08 |
2018-04-13 | 6.23 | 6.11 | 6.27 | 6.09 | 17134280 | 1.056886e+08 |
2018-04-16 | 0.00 | 0.00 | 0.00 | 0.00 | 0 | 0.000000e+00 |
2018-04-17 | 6.26 | 6.01 | 6.26 | 6.01 | 23077057 | 1.411712e+08 |
2018-04-18 | 6.05 | 6.09 | 6.12 | 5.90 | 14690685 | 8.846467e+07 |
2018-04-19 | 6.06 | 6.08 | 6.23 | 6.06 | 13842257 | 8.486182e+07 |
2018-04-20 | 6.04 | 5.98 | 6.11 | 5.95 | 12086284 | 7.270285e+07 |
数据的处理
利用函数 mean()
计算列的平均值
# 引用 pandas 库,并重命名为 pd
import pandas as pd
# 通过get_price函数获取一段时间内某股票的数据
date_frame = get_price('000009.XSHE',
start_date='2018-04-03',
end_date='2018-04-20', frequency='daily')
date_frame.mean()
open 6.172500e+00
close 6.165000e+00
high 6.265000e+00
low 6.075833e+00
volume 2.190368e+07
money 1.353789e+08
dtype: float64
利用函数 mean()
计算行的平均值
# 引用 pandas 库,并重命名为 pd
import pandas as pd
# 通过get_price函数获取一段时间内某股票的数据
date_frame = get_price('000009.XSHE',
start_date='2018-04-03',
end_date='2018-04-20', frequency='daily')
date_frame.mean(1)
2018-04-03 38129240.208333
2018-04-04 34411055.211667
2018-04-09 35431328.273333
2018-04-10 30273916.950000
2018-04-11 16631799.603333
2018-04-12 20934324.403333
2018-04-13 20470484.040000
2018-04-16 43133625.271667
2018-04-17 27374717.911667
2018-04-18 17192562.471667
2018-04-19 16450684.143333
2018-04-20 14131525.563333
dtype: float64
可以看出,mean()如果有参数,计算的是列,如果参数是1,计算的是行
三维数组
如果要获取多只股票的数据,则返回panle对象;可以通过panle[列标, 行标, 股票代码]来获取数据
# 引用 pandas 库,并重命名为 pd
import pandas as pd
# 通过get_price函数获取一段时间内某股票的数据
date_frame = get_price(['000009.XSHE', '000001.XSHE'],
start_date='2018-04-03',
end_date='2018-04-20',
frequency='daily')
date_frame
<class 'pandas.core.panel.Panel'>
Dimensions: 6 (items) x 12 (major_axis) x 2 (minor_axis)
Items axis: close to volume
Major_axis axis: 2018-04-03 00:00:00 to 2018-04-20 00:00:00
Minor_axis axis: 000009.XSHE to 000001.XSHE
对这个输出结果的解析:
- Items axis: close to volume - 列标
- Major_axis axis: 2018-04-03 00:00:00 to 2018-04-20 00:00:00 - 行标
- Minor_axis axis: 000009.XSHE to 000001.XSHE - 股票代码
显示两只股票的收盘价信息
# 引用 pandas 库,并重命名为 pd
import pandas as pd
# 通过get_price函数获取一段时间内某股票的数据
date_frame = get_price(['000009.XSHE', '000001.XSHE'],
start_date='2018-04-03',
end_date='2018-04-20',
frequency='daily')
date_frame['close',:,:]
000009.XSHE | 000001.XSHE | |
---|---|---|
2018-04-03 | 6.17 | 10.40 |
2018-04-04 | 6.24 | 10.71 |
2018-04-09 | 6.33 | 10.85 |
2018-04-10 | 6.26 | 11.25 |
2018-04-11 | 6.21 | 11.65 |
2018-04-12 | 6.24 | 11.35 |
2018-04-13 | 6.11 | 11.40 |
2018-04-16 | 6.26 | 10.93 |
2018-04-17 | 6.01 | 11.04 |
2018-04-18 | 6.09 | 11.33 |
2018-04-19 | 6.08 | 11.30 |
2018-04-20 | 5.98 | 11.18 |
显示两只股票2018年4月16日的数据信息
# 引用 pandas 库,并重命名为 pd
import pandas as pd
# 通过get_price函数获取一段时间内某股票的数据
date_frame = get_price(['000009.XSHE', '000001.XSHE'],
start_date='2018-04-03',
end_date='2018-04-20',
frequency='daily')
date_frame[:,'2018-04-16',:]
close | high | low | money | open | volume | |
---|---|---|---|---|---|---|
000009.XSHE | 6.26 | 6.48 | 6.22 | 2.233821e+08 | 6.26 | 35419584 |
000001.XSHE | 10.93 | 11.30 | 10.86 | 1.593706e+09 | 11.30 | 144892608 |
显示平安银行000001.XSHE的数据信息
# 引用 pandas 库,并重命名为 pd
import pandas as pd
# 通过get_price函数获取一段时间内某股票的数据
date_frame = get_price(['000009.XSHE', '000001.XSHE'],
start_date='2018-04-03',
end_date='2018-04-20',
frequency='daily')
date_frame[:,:,'000001.XSHE']
close | high | low | money | open | volume | |
---|---|---|---|---|---|---|
2018-04-03 | 10.40 | 10.51 | 10.35 | 9.422378e+08 | 10.44 | 90438595 |
2018-04-04 | 10.71 | 10.84 | 10.44 | 1.737259e+09 | 10.52 | 162702821 |
2018-04-09 | 10.85 | 10.93 | 10.57 | 1.180084e+09 | 10.64 | 109125449 |
2018-04-10 | 11.25 | 11.29 | 10.80 | 1.562265e+09 | 10.85 | 141225091 |
2018-04-11 | 11.65 | 11.74 | 11.21 | 2.458982e+09 | 11.22 | 212806679 |
2018-04-12 | 11.35 | 11.65 | 11.25 | 1.364676e+09 | 11.62 | 119109271 |
2018-04-13 | 11.40 | 11.61 | 11.28 | 1.516156e+09 | 11.46 | 132016725 |
2018-04-16 | 10.93 | 11.30 | 10.86 | 1.593706e+09 | 11.30 | 144892608 |
2018-04-17 | 11.04 | 11.28 | 10.94 | 1.468159e+09 | 10.95 | 132182805 |
2018-04-18 | 11.33 | 11.43 | 11.11 | 1.692723e+09 | 11.28 | 149844547 |
2018-04-19 | 11.30 | 11.51 | 11.25 | 9.795936e+08 | 11.35 | 86213489 |
2018-04-20 | 11.18 | 11.41 | 11.03 | 1.090801e+09 | 11.34 | 97337143 |
注:本文章为个人学习笔记,参考了一些书籍与官方教程,不作任何商业用途!
网友评论