数据处理之NumPy,pandas

IPython

  • IPython:交互式的Python命令行
  • 安装:pip3 install ipython
  • 使用:ipython
  • 快捷键:
    1. TAB键自动完成
    2. ?:内省、命名空间搜索
    3. !:执行系统命令
  • 魔术命令:以%开始的命令
    1. %run:执行文件代码
    2. %paste:执行剪贴板代码
    3. %timeit:评估运行时间
    4. %pdb:自动调试
  • 使用命令历史
  • 获取输入输出结果
  • 目录标签系统
  • IPython Notebook

一、如何使用Python进行量化投资

  • 自己编写:NumPy+pandas+Matplotlib+...
  • 在线平台:聚宽,优矿,米筐,Quantopian...
  • 开源框架:RQAlpha , QUANTAXIS,...
  • NumPy:数组批量计算
  • pandas:灵活的表计算
  • Matplotlib:数据可视化

NumPy模块

NumPy是高性能科学计算和数据分析的基础包。它是pandas等其他各种工具的基础。

  • 安装方法:pip3 install numpy
  • 引用方式:import numpy as np
  • NumPy的主要功能:
    1. ndarray,一个多维数组结构,高效且节省空间
    2. 无需循环对整组数据进行快速运算的数学函数
    3. 读写磁盘数据的工具以及用于操作内存映射文件的工具
    4. 线性代数、随机数生成和傅里叶变换功能
    5. 用于集成C、C++等代码的工具

一、ndarray多维数组对象

  • 创建ndarray:np.array(array_like)
  • ndarray是多维数组结构,与列表的区别是:
    1. 数组对象内的元素类型必须相同
    2. 数组大小不可修改

1、ndarray常用属性

  • T 数组的转置(对高维数组而言)
  • dtype 数组元素的数据类型
  • size 数组元素的个数
  • ndim 数组的维数
  • shape 数组的维度大小(以元组形式)

2、ndarray数据类型

  • 布尔型:bool_
  • 整型:int_ int8 int16 int32 int64
  • 无符号整型:uint8 uint16 uint32 uint64
  • 浮点型:float_ float16 float32 float64
  • 复数型:complex_ complex64 complex128

3、ndarray创建

  • array() 将列表转换为数组,可选择显式指定dtype
  • arange() range的numpy版,支持浮点数
  • linspace() 类似arange(),第三个参数为数组长度
  • zeros() 根据指定形状和dtype创建全0数组
  • ones() 根据指定形状和dtype创建全1数组
  • empty() 根据指定形状和dtype创建空数组(随机值)
  • eye() 根据指定边长和dtype创建单位矩阵

4、ndarray批量运算

  • 数组和标量之间的运算:
    1. a+1     a*3     1//a     a**0.5     a>5
  • 同样大小数组之间的运算:
    1. a+b     a/b     a**b     a%b       a==b
  • 数组的索引:
    1. 一维数组:a[5]
    2. 多维数组:
      1. 列表式写法:a[2][3]
      2. 新式写法:a[2,3] (推荐)
  • 数组的切片:
    1. 一维数组:a[5:8]     a[4:]     a[2:10] = 1
    2. 多维数组:a[1:2, 3:4]     a[:,3:5]     a[:,1]
    3. 与列表不同,数组切片时并不会自动复制,在切片数组上的修改会影响原数组。 【解决方法:copy()】
    4. copy()方法开源创建数组的深拷贝

5、布尔型索引

问题:给一个数组,选出数组中所有大于5的数。
答案:a[a>5]
原理:
a>5会对a中的每一个元素进行判断,返回一个布尔数组
布尔型索引:将同样大小的布尔数组传进索引,会返回一个由所有True对应位置的元素的数组

问题2:给一个数组,选出数组中所有大于5的偶数。
问题3:给一个数组,选出数组中所有大于5的数和偶数。
答案:
a[(a>5) & (a%2==0)]
a[(a>5) | (a%2==0)

6、花式索引*

问题1:对于一个数组,选出其第1,3,4,6,7个元素,组成新的二维数组。
答案:a[[1,3,4,6,7]]

问题2:对一个二维数组,选出其第一列和第三列,组成新的二维数组。
答案:a[:,[1,3]]

二、NumPy:通用函数

ceil:向上取整 3.6 -》4 3.1-》4 -3.1-》-3

floor:向下取整:3.6-》3 3.1-》3 -3.1-》-4

rint(round):四舍五入:3.6-》4 3.1-》3 -3.6-》-4

trunc(int):向零取整(舍去小数点后) 3.6-》3 3.1-》3 -3.1-》-3

arr = np.arange(10)
arr.sum()#45  求和
arr.mean()#4.5 平均值
arr.cumsum()  #array([ 0,  1,  3,  6, 10, 15, 21, 28, 36, 45], dtype=int32) #等差数列 
arr.std() #、求标准差

通用函数:能同时对数组中所有元素进行运算的函数
常见通用函数:
一元函数:abs(绝对值), sqrt(开方), exp, log, ceil, floor, rint, trunc, modf(分别取出小数部分和整数部分), isnan, isinf, cos, sin, tan
二元函数:add, substract, multiply, divide, power, mod, maximum, mininum,

三、补充知识:浮点数特殊值

浮点数:float
浮点数有两个特殊值:
nan(Not a Number):不等于任何浮点数(nan != nan)
inf(infinity):比任何浮点数都大

NumPy中创建特殊值:np.nan    np.inf
在数据分析中,nan常被用作表示数据缺失值

四、数学和统计方法

sum    求和
cumsum 求前缀和
mean    求平均数
std    求标准差
var    求方差
min    求最小值
max    求最大值
argmin    求最小值索引
argmax    求最大值索引

五、随机数生成

随机数生成函数在np.random子包内
常用函数
rand        给定形状产生随机数组(0到1之间的数)
randint        给定形状产生随机整数
choice        给定形状产生随机选择
shuffle        与random.shuffle相同
uniform        给定形状产生随机数组

pandas

pandas是一个强大的Python数据分析的工具包,pandas是基于NumPy构建的。

  • 安装方法:pip3 install pandas
  • 引用方式:import pandas as pd
  • pandas的主要功能:
    1. 具备对其功能的数据结构DataFrame、Series
    2. 集成时间序列功能
    3. 提供丰富的数学运算和操作
    4. 灵活处理缺失数据

一、Series

Series是一种类似于一位数组的对象,由一组数据和一组与之相关的数据标签(索引)组成。

1、创建方式

pd.Series([4,7,-5,3]) 
pd.Series([4,7,-5,3],index=['a','b','c','d'])               
pd.Series({'a':1, 'b':2})             
pd.Series(0, index=['a','b','c','d’])

2、Series特性

Series支持数组的特性:
从ndarray创建Series:Series(arr)
与标量运算:sr*2
两个Series运算:sr1+sr2
索引:sr[0], sr[[1,2,4]]
切片:sr[0:2](切片依然是视图形式)
通用函数:np.abs(sr)
布尔值过滤:sr[sr>0]
统计函数:mean() sum() cumsum()
Series支持字典的特性(标签):
从字典创建Series:Series(dic), 
in运算:’a’ in sr、for x in sr
键索引:sr['a'], sr[['a', 'b', 'd']]
键切片:sr['a':'c']
其他函数:get('a', default=0)等

3、Series整数索引

整数索引的pandas对象往往会使新手抓狂。
例:
sr = np.Series(np.arange(4.))
sr[-1] 

如果索引是整数类型,则根据整数进行数据操作时总是面向标签的。
loc属性        以标签解释
iloc属性        以下标解释 

4、Series数据对齐

pandas在运算时,会按索引进行对齐然后计算。如果存在不同的索引,则结果的索引是两个操作数索引的并集。

例:
sr1 = pd.Series([12,23,34], index=['c','a','d'])
sr2 = pd.Series([11,20,10], index=['d','c','a',])
sr1+sr2
sr3 = pd.Series([11,20,10,14], index=['d','c','a','b'])
sr1+sr3

如何在两个Series对象相加时将缺失值设为0?
sr1.add(sr2, fill_value=0)
灵活的算术方法:add, sub, div, mul

5、Series缺失数据

缺失数据:使用NaN(Not a Number)来表示缺失数据。其值等于np.nan。内置的None值也会被当做NaN处理。

处理缺失数据的相关方法:
dropna()        过滤掉值为NaN的行
fillna()        填充缺失数据
isnull()        返回布尔数组,缺失值对应为True
notnull()        返回布尔数组,缺失值对应为False

二、DataFrame

1、创建方式

DataFrame是二维数据对象
DataFrame是一个表格型的数据结构,含有一组有序的列。
DataFrame可以被看做是由Series组成的字典,并且共用一个索引。

创建方式:
pd.DataFrame({'one':[1,2,3,4],'two':[4,3,2,1]})
pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']), 'two':pd.Series([1,2,3,4],index=['b','a','c','d'])})
......

csv文件读取与写入:
df.read_csv('filename.csv')
df.to_csv()

2、DataFrame常用属性及方法

index                    获取索引
T                        转置
columns                    获取列索引
values                    获取值数组
describe()                获取快速统计

DataFrame各列name属性:列名
rename(columns={})

3、DataFrame索引和切片

DataFrame是一个二维数据类型所以有行索引和列索引。

DataFrame同样可以通过标签和位置两种方法进行索引和切片。

loc属性和iloc属性
使用方法:逗号隔开,前面是行索引,后面是列索引
行/列索引部分可以是常规索引、切片、布尔值索引、花式索引任意搭配。

DataFrame使用索引切片:

方法1:两个中括号,先取列再取行。    df['A'][0]
方法2(推荐):使用loc/iloc属性,一个中括号,逗号隔开,先取行再取列。
loc属性:解释为标签
iloc属性:解释为下标
向DataFrame对象中写入值时只使用方法2
行/列索引部分可以是常规索引、切片、布尔值索引、花式索引任意搭配。(注意:两部分都是花式索引时结果可能与预料的不同)

通过标签获取:
df['A']
df[['A', 'B']]
df['A'][0]
df[0:10][['A', 'C']]
df.loc[:,['A','B']]
df.loc[:,'A':'C']
df.loc[0,'A']
df.loc[0:10,['A','C']]

通过位置获取:
df.iloc[3]
df.iloc[3,3]
df.iloc[0:3,4:6]
df.iloc[1:5,:]
df.iloc[[1,2,4],[0,3]]
通过布尔值过滤: df[df[
'A']>0] df[df['A'].isin([1,3,5])] df[df<0] = 0

4、DataFrame数据对齐与缺失数据

DataFrame对象在运算时,同样会进行数据对齐,行索引与列索引分别对齐。
结果的行索引与列索引分别为两个操作数的行索引与列索引的并集。

DataFrame处理缺失数据的相关方法:
dropna(axis=0,where='any',…)
fillna()
isnull()
notnull()

三、pandas其他常用方法

pandas常用方法(适用Series和DataFrame):
mean(axis=0,skipna=False)
sum(axis=1)
sort_index(axis, …, ascending)        按行或列索引排序
sort_values(by, axis, ascending)    按值排序
NumPy的通用函数同样适用于pandas

apply(func, axis=0)    将自定义函数应用在各行或者各列上                                  ,func可返回标量或者Series
applymap(func)        将函数应用在DataFrame各个元素上
map(func)        将函数应用在Series各个元素上

四、pandas时间对象处理

时间序列类型:
时间戳:特定时刻
固定时期:如2017年7月
时间间隔:起始时间-结束时间
Python标准库:datetime
date time datetime timedelta
dt.strftime()
strptime()
灵活处理时间对象:dateutil包
dateutil.parser.parse()
成组处理时间对象:pandas
pd.to_datetime(['2001-01-01', '2002-02-02'])

产生时间对象数组:date_range
start        开始时间
end        结束时间
periods        时间长度
freq        时间频率,默认为'D',可选H(our),W(eek),B(usiness),S(emi-)M(onth),(min)T(es), S(econd), A(year),…

五、pandas时间序列

时间序列就是以时间对象为索引的Series或DataFrame。

datetime对象作为索引时是存储在DatetimeIndex对象中的。

时间序列特殊功能:
传入“年”或“年月”作为切片方式
传入日期范围作为切片方式
丰富的函数支持:resample(), strftime(), ……
批量转换为datetime对象:to_pydatetime()

六、pandas从文件读取

读取文件:从文件名、URL、文件对象中加载数据
read_csv        默认分隔符为csv
read_table    默认分隔符为\t
read_excel    读取excel文件
读取文件函数主要参数:
sep        指定分隔符,可用正则表达式如'\s+'
header=None    指定文件无列名
name        指定列名
index_col    指定某列作为索引
skip_row        指定跳过某些行
na_values    指定某些字符串表示缺失值
parse_dates    指定某些列是否被解析为日期,布尔值或列表

七、pandas写入到文件

写入到文件:
to_csv
写入文件函数的主要参数:
sep
na_rep        指定缺失值转换的字符串,默认为空字符串
header=False    不输出列名一行
index=False    不输出行索引一列
cols        指定输出的列,传入列表

其他文件类型:json, XML, HTML, 数据库
pandas转换为二进制文件格式(pickle):
save
load

Matplotlib

Matplotlib是一个强大的Python绘图和数据可视化的工具包。

  • 安装方法:pip install matplotlib
  • 引用方法:import matplotlib.pyplot as plt
  • 绘图函数:plt.plot()
  • 显示图像:plt.show()

一、plot函数

plot函数:绘制折线图
线型linestyle(-,-.,--,..)
点型marker(v,^,s,*,H,+,x,D,o,…)
颜色color(b,g,r,y,k,w,…)

plot函数绘制多条曲线
pandas包对plot的支持

二、图像标注

设置图像标题:plt.title()
设置x轴名称:plt.xlabel()
设置y轴名称:plt.ylabel()
设置x轴范围:plt.xlim()

设置y轴范围:plt.ylim()
设置x轴刻度:plt.xticks()
设置y轴刻度:plt.yticks()
设置曲线图例:plt.legend()

三、Matplotlib实例——绘制数学函数图像

使用Matplotlib模块在一个窗口中绘制数学函数y=x, y=x2, y=3x3+5x2+2x+1的图像,使用不同颜色的线加以区别,并使用图例说明各个线代表什么函数。

import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(-100,100,1000000)
y1=x
y2=x**2
y3=3*x**3+5*x**2+2*x+1
plt.plot(x,y1,label="$y=x")
plt.plot(x,y2,label="$y=x^2$")
plt.plot(x,y3,label="$y=3x^3+5x^2+2x+1$")
plt.legend()
plt.show()

四、画布与子图

画布:figure
fig = plt.figure()
图:subplot
ax1 = fig.add_subplot(2,2,1)
调节子图间距:
subplots_adjust(left, bottom, right, top, wspace, hspace)

五、支持的图类型

六、绘制K线图

matplotlib.finanace子包中有许多绘制金融相关图的函数接口。
绘制K线图:matplotlib.finance.candlestick_ochl函数

Tushare

  • Tushare是一个免费、开源的python财经数据接口包。

猜你喜欢

转载自www.cnblogs.com/bubu99/p/10659616.html