小伙伴们都知道python功能强大,在金融量化分析中运用广泛,python常用的数据分析包很多,下面先给大家简单列举一些(如果您刚开始学python觉得这东西很烦看不懂,那么请不要担心,直接忽视跳到第二节吧~因为您不会错过任何精彩内容~如果您是老司机,那么欢迎私戳讨论【微笑】):
一. 数据分析常用包
(1)NumPy:
NumPy是基于Python的科学计算的基础包,可用来存储和处理大型矩阵,提供了矩阵、线性代数、傅里叶变换和随机生成函数等解决方案。
(2)SciPy:
SciPy是基于NumPy的库,它提供了方便、快捷的N维数组操作。它包括统计、优化、整合、线性代数模块、傅里叶变换、信号和图像处理、常微分方程求解器等等。
(3)Statsmodels:
Statismodels是一个Python包,提供一些互补scipy统计计算的功能,包括描述性统计和统计模型估计和推断,主要用户统计建模和计量经济学。
(4)Pandas
Pandas 是基于NumPy 的一种工具,Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。
(5)TAlib:
TAlib是一个处理金融数据和技术分析的开放代码库。
(6)其他
networkx、Pillow 、Py 、Pytz、Requests 、Scipy、sympy 、Tables 、xlrd、xlwt等
二. NumPy
(1)ndarray数组基础
Pyhton 中用列表保存一组值,可将列表当成是数组使用。此外,Python 有 array 模快,但他不支持多维数组,无论是列表还是 array 模块都没有科学运算函数,不适合做矩阵等科学计算。因此,NumPy没有使用 Python 本身的数组机制,而是提供了ndarray 数组对象,该对象不断能方便的存取数组,而且拥有丰富的数组计算函数,比如向量的加法、减法、乘法等。使用 ndarray 数组,首先需要导入 Numpy 函数库,也可以直接导入该函数库。
创建数组是进行数组计算的先决条件,可以通过array()函数定义数组实例对象,其参数为Python 的序列对象。
文字描述太枯燥,我们来举个例子:
from numpy import *
import numpy as np
a=np.array([[1,2,4],[3,6,9]])
print(a)
结果是这样的:
[[1 2 4]
[3 6 9]]
(2)数组支持索引和切片
NumPy数组可按照列表的方式进行索引和切片,也可按如下方式访问数组中行、列与特定元素:
我们还是用上一个例子:
from numpy import *
import numpy as np
a=np.array([[1,2,4],[3,6,9]])
print(a)
print(a[:,1])
print(a[1,1])
结果如下:
[[1 2 4]
[3 6 9]]
[2 6]
6
三. Pandas
pandas包含高级的数据结构和精巧的工具,使得在Python中处理数据非常快速和简单。pandas建造在NumPy之上,它使得以NumPy为中心的应用很容易使用。我们首先导入库:
import pandas as pd
pandas主要包含三种数据结构:Series、DataFrame和Panel。
(1)Series
Series是一个一维的类似的数组对象,包含一个数组的数据(任何NumPy的数据类型)和一个与数组关联的数据标签,被叫做索引 。
Series创建
我们首先创建一个Series:
import pandas as pd
s=pd.Series([3,10000,10.8,'stock'])
print(s)
输出:
0 3
1 10000
2 10.8
3 stock
dtype: object
上例中左右两列即分别为索引index 和 values。因为传给构造器的是一个列表,所以 index 的值是从 0 起递增的整数,如果传入的是一个类字典的键值对结构,就会生成 index-value 对应的 Series;或者在初始化的时候以关键字参数显式指定一个 index 对象:
如:
s=pd.Series(data=[10.5,15.7,np.nan],index=['stockA','stockB','stockC'])
print(s)
print(s.data)
print(s.index)
print(s.values)
print(s[2]) # series也支持索引和切片
输出:
stockA 10.5
stockB 15.7
stockC NaN
dtype: float64
Index(['stockA', 'stockB', 'stockC'], dtype='object')
[ 10.5 15.7 nan]
nan
(2)DataFrame
一个DataFrame表示一个表格,类似电子表格的数据结构,包含一个经过排序的列表集,它们没一个都可以有不同的类型值(数字,字符串,布尔等等)。DataFrame有行和列的索引,它可以被看作是一个Series的字典(每个Series共享一个索引)。
DataFrame创建
创建DataFrame方法如下:
df=DataFrame(data=数据,index=索引,columns=列名)
例如,为创建一个索引是时间序列的DataFrame,首先创建一个时间序列:
dates=pd.date_range('2017-01-01',periods=3)
print(dates)
输出:
DatetimeIndex(['2017-01-01', '2017-01-02', '2017-01-03'], dtype='datetime64[ns]', freq='D')
然后创建DataFrame:
df=pd.DataFrame(np.array([[10.5,15.7,11.2],[10.8,11.0,11.2],[9.4,10.2,9.8]]),index=dates,columns=['stockA','stockB','stockC'])
print(df)
输出:
stockA stockB stockC
2017-01-01 10.5 15.7 11.2
2017-01-02 10.8 11.0 11.2
2017-01-03 9.4 10.2 9.8
DataFrame也支持索引和切片:
print(df.ix[:2,:2])
print(df[['stockA','stockC']])
print(df[:2])
输出:
stockA stockB
2017-01-01 10.5 15.7
2017-01-02 10.8 11.0
stockA stockC
2017-01-01 10.5 11.2
2017-01-02 10.8 11.2
2017-01-03 9.4 9.8
stockA stockB stockC
2017-01-01 10.5 15.7 11.2
2017-01-02 10.8 11.0 11.2
支持排序和排名
s=pd.Series({'stockA':10.5,'stockB':15.7,'stockC':np.nan})
print(s.sort_values(ascending=False))
输出:
stockB 15.7
stockA 10.5
stockC NaN
dtype: float64
支持统计方法(Very important!):
如:
dates=pd.date_range('2017-01-01',periods=3)
print(dates)
df=pd.DataFrame(np.array([[11,12,13],[13,14,15],[12,13,15]]),index=dates,columns=['stockA','stockB','stockC'])
new_dates=pd.date_range('2017-01-01',periods=4)
print(df.sort_values('stockB'))
print(df.diff())
print(df.cumsum())
print(df.mean())
print(df.var())
print(df.std())
输出:
DatetimeIndex(['2017-01-01', '2017-01-02', '2017-01-03'], dtype='datetime64[ns]', freq='D')
stockA stockB stockC
2017-01-01 11 12 13
2017-01-03 12 13 15
2017-01-02 13 14 15
stockA stockB stockC
2017-01-01 NaN NaN NaN
2017-01-02 2 2 2
2017-01-03 -1 -1 0
stockA stockB stockC
2017-01-01 11 12 13
2017-01-02 24 26 28
2017-01-03 36 39 43
stockA 12.000000
stockB 13.000000
stockC 14.333333
dtype: float64
stockA 1.000000
stockB 1.000000
stockC 1.333333
dtype: float64
stockA 1.000000
stockB 1.000000
stockC 1.154701
dtype: float64
码字码得手酸.....剩下的下次分享(微笑)
注:其中部分资料来源于量化金融平台Mindgo社区:
如果您觉得还不错,轻轻地帮宝宝点个赞吧~嘻嘻