numpy 、pandas 和Matplotlib基本用法的整理与汇总

新手专区
标签: #<Tag:0x00007fcf641c8460>

(lpl22) #1

27 个机器学习、数学、Python 速查表

BigQuant-10分钟学会Pandas
[/quote]

一.NumPy

NumPy系统是Python的一种开源的数值计算扩展。NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生

1.引用NumPy :

import numpy as np

2.引用与输出文件

#引用某txt文件
np.loadtxt('file.txt')
#引用某csv文件
np.genfromtxt('file.csv',delimiter=',')
#输出至某txt文件
np.savetxt('file.txt',arr,delimiter=' ')
#输出至某csv文件
np.savetxt('file.csv',arr,delimiter=',')

3.创建数组:

#创建一个二维数组(实际上其维数可以为任意维)
np.array([(1,2,3),(4,5,6)])
#创建一个长度为3,元素均为0的一维数组
np.zeros(3)
#创建一个3x4,元素均为1的数组
np.ones((3,4))
#创建一个5x5,对角元素为1,其余元素为0的数组
np.eye(5)
#创建一个首项为0,末项为100,一共6项的等差数列
np.linspace(0,100,6)
#创建一个首项为0,公差为3,末项不大于10的等差数列
np.arange(0,10,3)
#创建一个元素全为8的2x3的数组
np.full((2,3),8)
#创建一个每个元素在(0,1)内随机取值的4x5数组
#(可通过将其数乘或与元素全为1的数组进行加减,从而得到在任意范围波动的数组)
np.random.rand(4,5)
#创建一个元素在(0,5)之间的整数中随机取值的2x3数组
np.random.randint(5,size=(2,3)) 

4.考察数组属性

#考察数组元素个数
arr.size
#考察数组行列维数
arr.shape
#考察数组中元素的数值类型
arr.dtype
#将数组元素转换为dtype
arr.astype(dtype) 
#将数组转换为Python中列表
arr.tolist()

5.数组的排列、复制与重造

#复制数组
np.copy(arr)
#以特定轴对数组进行排列(括号内代码可省略,省略时按默认轴)
arr.sort(axis=0)
#在不改变其他元素数值的前提下,将数组转化为3x4维
arr.reshape(3,4)
#同上,但对于赋予新的数值0
arr.resize((5,6))

6.添加与删除元素

#将某数值(values)附加至某数组(arr)末尾。(以下指代同)
np.append(arr,values)
#将某数值插入数组第2+1个空位
np.insert(arr,2,values)
#删除数组第3+1个元素
np.delete(arr,3,axis=0)

7.数组的合并与分离

#将数组arr2加在arr1的末行(若axis=1,则为加在末列)
np.concatenate((arr1,arr2),axis=0)
#将arr分为3个子数组
np.split(arr,3)

8.数组的索引、切断与创建子集

#显示数组的第5个元素
arr[5]
#显示数组第2x5个元素
arr[2,5]
#将数组第一个元素改为4
arr[1]=4
#显示第4列第0,1,2行元素(若为[:,4],则显示第四列所有元素,<、>、&等符号同样适用)
arr[0:3,4]

9.数组计算:

#数组中每个元素加一(subtract、multipy、divide、power同理)
np.add(arr,1) 
#将第一行加至第二行(subtract、multipy、divide、power同理)
np.add(arr1,arr2) 
#对数组中每个元素进行平方(sin、log、abs、ceil、floor、round同理)
np.sqrt(arr)

10.数组中数据的统计

#对数组每列所有元素求平均值
np.mean(arr,axis=0)
#对数组中所有元素求和
arr.sum()
#找出某特定轴中的最大值
arr.max(axis=0)
#计算某特定轴的标准值
np.std(arr,axis=1) 
#计算数组相关系数
arr.corrcoef() 

二.Matplotlib

Matplotlib可能是Python 2D绘图领域使用最广泛的库。它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式

1.引用Matplotlib

#(为了方便,这里将模块命名为plt)
import matplotlib.pylot as plt

2.二维图像绘制以及注释

#此处x可为列表或元组,图像x轴默认对应1.2......x,y轴均默认等分
plt.plot(x)
#对图像进行标注:线宽为5,标题为“Square Numbers”字体大小为24,x轴标注为“Value”,
#字体大小为14,y轴同理
plt.plot(x, linewidth=5)
plt.title("Square Numbers", frontsize=24)
plt.xlabel("Value", frontsize=14)
plt.ylabel("Square of Value", frontsize=14)

3.绘制散点图

#在二维平面图上描出点(2,4),散点图的图像标注与plot同理
plt.scatter(2,4)
plt.show()

4.自动计算数据

x = list(range(1,1001))
y = [x**2 for x_values in x]
plt.scatter(x, y, s=40)
plt.show

5.对图像的优化

#代码’edgecolor='none'‘删除了数据点的轮廓,'c='red''使数据点颜色变为红色
plt.scatter(x, y, edgecolor='none', c='red', s=40)
#通过将c赋值为y,实现了可视化过程中的颜色渐变
plt.scatter(x, y, edgecolor='none', c=y', s=40, cmap=plt.cm.Blues)

三.Pandas

Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法

1.引用pandas:

import pandas as pd

2.创建Series与DataFrame

Series 可以近似理解为Python语言中的字典,创建方法如下:

# 创建Series,以日期为索引
dates = pd.date_range('2/6/2017', periods=5, freq='D')
s = pd.Series([1,3,5,np.nan,6,],index=dates)
代码结果
2017-02-06    1.0
2017-02-07    3.0
2017-02-08    5.0
2017-02-09    NaN
2017-02-10    6.0

Freq: D, dtype: float64

DataFrame是一个表格型 的数据结构,可以简单地理解为是由多个具有相同的索引的Series组成,也可理解为带有行列标注的、元素可以为字符的矩阵。DataFrame是金融数据分析中特别常用的数据结构,也是我们平台最常遇到的数据结构。

# 创建DataFrame,以日期为索引
df = pd.DataFrame(np.random.randn(5,4), index=dates, columns=list('ABCD'))
df
#读取CSV文件,excel文件、 SQL Query 或 Database Table同理
pd.read_csv('file.csv', header=None, nrows=5)
pd.to_csv('myDataFrame.csv')
# 以一次bigquant平台获取数据为创建DataFrame为例子
df = DataSource('instruments_CN_OPTION').read(start_date='2019-01-01',
      end_date='2019-01-02').head()
df 
代码结果
date instrument name
0 2019-01-02 10001417.SHAO 50ETF购3月2352A
1 2019-01-02 10001597.SHAO 50ETF购6月2.25
2 2019-01-02 10001598.SHAO 50ETF购6月2.30
3 2019-01-02 10001599.SHAO 50ETF购6月2.35
4 2019-01-02 10001600.SHAO 50ETF购6月2.40

3.查找、查看数据(以下举例均按照上述例子为样本)

# 显示DataFrame前几行(默认是5)的数据
df.head()
# bigquant平台获取数据
df = DataSource('instruments_CN_OPTION').read(start_date='2019-01-01',end_date='2019-01-02').head()
df.head(3)
date instrument name
0 2019-01-02 10001417.SHAO 50ETF购3月2352A
1 2019-01-02 10001597.SHAO 50ETF购6月2.25
2 2019-01-02 10001598.SHAO 50ETF购6月2.30
# 显示DataFrame后行的数据
df.tail()
# bigquant平台获取数据,
#".tail()"括号内不填数字则默认最后五位,head()同理
df = DataSource('instruments_CN_OPTION').read(start_date='2019-01-01',
end_date='2019-01-02').head()
df.tail()
date instrument name
0 2019-01-02 10001417.SHAO 50ETF购3月2352A
1 2019-01-02 10001597.SHAO 50ETF购6月2.25
2 2019-01-02 10001598.SHAO 50ETF购6月2.30
3 2019-01-02 10001599.SHAO 50ETF购6月2.35
4 2019-01-02 10001600.SHAO 50ETF购6月2.40
# 查看数据索引(数据列名,底层numpy数据,数据类型均同理,大体与Numpy相似,布尔索引同样适用)
df.index
# bigquant平台获取数据,实际操作中,可以根据不同需要选择不同的索引
df = DataSource('instruments_CN_OPTION').read(start_date='2019-01-01',
    end_date='2019-01-02').head()
df = df.set_index('name')
date instrument
name
50ETF购3月2352A 2019-01-02 10001417.SHAO
50ETF购6月2.25 2019-01-02 10001597.SHAO
50ETF购6月2.30 2019-01-02 10001598.SHAO
50ETF购6月2.35 2019-01-02 10001599.SHAO
50ETF购6月2.40 2019-01-02 10001600.SHAO
# 选择某一列数据,它会返回一个Series,等同于df.close:
df = DataSource('instruments_CN_OPTION').read(start_date='2019-01-01',
    end_date='2019-01-02').head()
df = df.set_index('date')
instrument name
date
2019-01-02 10001417.SHAO 50ETF购3月2352A
2019-01-02 10001419.SHAO 50ETF购3月2450A
2019-01-02 10001420.SHAO 50ETF购3月2500A
2019-01-02 10001421.SHAO 50ETF购3月2549A
2019-01-02 10001422.SHAO 50ETF购3月2598A

4.对数据的转置、排序、偏移等操作

#删除DataFrame的某一行/列
 df.drop('Index', axis=1) 
df = DataSource('instruments_CN_OPTION').read(start_date='2019-01-01',
     end_date='2019-01-02').head()
df.drop('date', axis=1) 
instrument name
0 10001417.SHAO 50ETF购3月2352A
1 10001597.SHAO 50ETF购6月2.25
2 10001598.SHAO 50ETF购6月2.30
3 10001599.SHAO 50ETF购6月2.35
4 10001600.SHAO 50ETF购6月2.40
# 转置
df.T
df = DataSource('instruments_CN_OPTION').read(start_date='2019-01-01',
    end_date='2019-01-02').head()
df.T
0 1 2 3 4
date 2019-01-02 00:00:00 2019-01-02 00:00:00 2019-01-02 00:00:00 2019-01-02 00:00:00 2019-01-02 00:00:00
instrument 10001417.SHAO 10001597.SHAO 10001598.SHAO 10001599.SHAO 10001600.SHAO
name 50ETF购3月2352A 50ETF购6月2.25 50ETF购6月2.30 50ETF购6月2.35 50ETF购6月2.40
# 按轴进行排序(ascending=False决定数据为降序排列)
df.sort_index(axis=1, ascending=False)
df = DataSource('instruments_CN_OPTION').read(start_date='2019-01-01',
      end_date='2019-01-02').head()
df.sort_index(axis=1, ascending=False)
name instrument date
0 50ETF购3月2352A 10001417.SHAO 2019-01-02
1 50ETF购6月2.25 10001597.SHAO 2019-01-02
2 50ETF购6月2.30 10001598.SHAO 2019-01-02
3 50ETF购6月2.35 10001599.SHAO 2019-01-02
4 50ETF购6月2.40 10001600.SHAO 2019-01-02
# 按值进行排序
df.sort_values(by='close',ascending=False)
# 为使表格简介,本段代码在引用营业部信息的基础上,删除了一些instruments
DataSource('dragon_origin_yyb').read().drop('name', axis=1).drop('code', axis=1)
.drop('type', axis=1).drop('kind', axis=1).head(10)
排序前
bMoney btRate date instrument jMoney sMoney stRate
194072 0.0000 0.0000 2015-01-05 002544.SZA -1006.244567 1006.244567 2.8606
194042 0.6089 0.0029 2015-01-05 300407.SZA -266.924560 267.533460 1.2565
194032 0.0000 0.0000 2015-01-05 300268.SZA -166.801200 166.801200 2.8706
194022 0.0000 0.0000 2015-01-05 300319.SZA -64.057500 64.057500 6.5370
194016 0.0000 0.0000 2015-01-05 300410.SZA -0.854500 0.854500 13.1579
194010 0.0000 0.0000 2015-01-05 300411.SZA -1.013500 1.013500 8.2645
194004 0.0000 0.0000 2015-01-05 300412.SZA -1.077000 1.077000 15.3846
193998 0.0000 0.0000 2015-01-05 600485.SHA -943.755294 943.755294 3.3492
193988 0.0000 0.0000 2015-01-05 600990.SHA -572.776478 572.776478 3.8643
193978 0.0000 0.0000 2015-01-05 300162.SZA -504.116109 504.116109 3.7099
#在上个代码的基础上,我们对表格关于净收入(即jMoney)进行降序排列
df = DataSource('dragon_origin_yyb').read().drop('name', axis=1)
.drop('code', axis=1).drop('type', axis=1).drop('kind', axis=1).head(10)
df.sort_values(by='jMoney',ascending=False)
排序后
bMoney btRate date instrument jMoney sMoney stRate
194016 0.0000 0.0000 2015-01-05 300410.SZA -0.854500 0.854500 13.1579
194010 0.0000 0.0000 2015-01-05 300411.SZA -1.013500 1.013500 8.2645
194004 0.0000 0.0000 2015-01-05 300412.SZA -1.077000 1.077000 15.3846
194022 0.0000 0.0000 2015-01-05 300319.SZA -64.057500 64.057500 6.5370
194032 0.0000 0.0000 2015-01-05 300268.SZA -166.801200 166.801200 2.8706
194042 0.6089 0.0029 2015-01-05 300407.SZA -266.924560 267.533460 1.2565
193978 0.0000 0.0000 2015-01-05 300162.SZA -504.116109 504.116109 3.7099
193988 0.0000 0.0000 2015-01-05 600990.SHA -572.776478 572.776478 3.8643
193998 0.0000 0.0000 2015-01-05 600485.SHA -943.755294 943.755294 3.3492
194072 0.0000 0.0000 2015-01-05 002544.SZA -1006.244567 1006.244567 2.8606
# 利用pct_change计算每日收益
df = D.history_data(['000001.SZA'],'2010-01-01','2016-12-31',fields=['close']
,groupped_by_instrument=False).set_index('date')['close']
rets = df.pct_change()
# 上述代码等价于pct_change函数
daily_returns = df / df.shift(1) -1 # 正数表示向前偏移,负数表示向后偏移
daily_returns.head()

5.对齐、合并、赋值

# 通过索引,自动对齐两个DataFrame的数据
df1 = D.history_data(['000005.SZA'],start_date='2017-02-01',end_date='2017-02-10',
                    fields=['open','high','low','close'], 
              groupped_by_instrument=False).set_index('date')

df2 = D.history_data(['000005.SZA'],start_date='2017-01-01',end_date='2017-02-10',
                    fields=['market_cap','pe_ttm'], 
              groupped_by_instrument=False).set_index('date')
# 取索引的交集进行合并
df1.merge(df2,left_index=True,right_index=True,how='inner')
# 取索引的并集进行合并
df1.merge(df2,left_index=True,right_index=True,how='outer')
# 通过标签赋值
df1.ix['2017-02-03','market_cap'] = 0
df1
# 通过concat()来连接pandas对象
a = df2.ix['2016-11-15':'2016-11-16']
b = df2.ix['2016-11-20':'2016-11-26']
pd.concat([a,b])
# 合并,和merge功能类似
df5 = D.history_data(['000005.SZA'],start_date='2017-02-01',end_date='2017-02-10',
                    fields=['open','high','low','close'], 
                               groupped_by_instrument=False).set_index('date')

df6 = D.history_data(['000005.SZA'],start_date='2017-01-01',end_date='2017-02-10',
                    fields=['market_cap','pe_ttm'], 
                               groupped_by_instrument=False).set_index('date')

# 删除股票代码列
del df5['instrument']
del df6['instrument']

# 按日期轴合并数据
df5.join(df6)
# 通过append方法,将若干行添加到dataFrame后面
c = df1.ix['2017-02-03':'2017-02-06']
d = df1.ix['2017-02-08':'2017-02-10']
c.append(d)

6.对数据的统计

# describe()能对数据做一个快速统计汇总
df2.describe()
# 按列计算平均值(按行只需变为“.mean(1)”)
df2.mean()
#也许大多数人都有在Excel中使用数据透视表的经历,
#其实Pandas也提供了一个类似的功能,名为pivot_table
df = pd.DataFrame({'A' : ['one', 'one', 'two', 'three'] * 3,
                   'B' : ['A', 'B', 'C'] * 4,
                   'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 2,
                   'D' : np.random.randn(12),
                   'E' : np.random.randn(12)})
# 我们可以轻松得到数据透视表
pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'])

27 个机器学习、数学、Python 速查表

BigQuant-10分钟学会Pandas