NumPy回顾

换工作之后,PYTHON就放下啦,基本没接触了,也都忘记的差不多了,现在重新捡起来

1.1 NumPy Array基础

NumPy是python运用于数据分析、科学计算最重要的库之一;

提供类强大的 ndarray类型用于处理多维数据.

可以定义一个python的array,然后用np.array()转化。

另外,numpy中的array元素如果有一个是浮点数,那么这个array中的所有元素都会以浮点数存储;

Numpy的Ndarray的数据结构必须是相同的;是和list是有区别的;

1.2 Numpy Ndarray的基本属性

.ndim 维度

.shape 每个维度的长度

.size 整个数组的长度,等于各个维度长度之积

.dtype 内部数据的类型

.itemsize 每个元素的字节长度

.nbytes 整个数组的字节长度,等于 .itemsize * .size

1.3 Numpy Ndarray的创建方法

使用其他数据类型创建ndarray

1.利用列表创建Ndarray:

close_list = [10, 10.5, 11.0, 11.5, 12.0]

close_array = np.array(close_list)

2.元祖创建:

stock_info_tuple = ('000001', '平安银行', '银行', 10.20) 

stock_info_array = np.array(stock_info_tuple)

3.  使用np.arange()函数创建一维array

np_arange_array = np.arange(5)                       

4. 使用np.zeros()函数创建array

zeros_array = np.zeros((4, 3))   

5. 使用np.ones()函数创建多维array

ones_array = np.ones((2, 3))

6.#使用np.ones_like创建结构相同、元素由1填充的ndarray

ones_like_array = np.ones_like(zeros_array)   

# 类似用法: np.zeros_like() 跟c结构一样的全部是1的组合;

ones_like_array

7. 使用np.empty()函数创建没有使用特定值初始化的ndarray,

empty_array = np.empty((3, 4))

linspace_array = np.linspace(5, 15, 11)

2. numpy操作方式

2.1 数据索引和切片

2.1.1 一维ndarray进行索引和切片

close_array = np.array([10, 10.5, 11.0, 11.5, 12.0,13, 15.5])

close_array[0]        # 取出第一天收盘价

close_array[-1]      # 取出最后一天收盘价

# ndarray索引与list类似

close_array[-2:]      # 取出最后两天收盘价

# ndarray索引与list类似

2.1.2 多维ndarray进行索引和切片

volume_stock1 = [10, 20, 10, 15, 20]             

volume_stock2 = [25, 75, 10, 15, 100]

volume_stock3 = [55, 35, 10, 20, 20]

volume_matrix = np.array([volume_stock1, volume_stock2, volume_stock3])

volume_matrix        # 3支股票近5天的交易量

volume_matrix[0]                  # 第一行, 第一支股票近五天交易量

volume_matrix[0, 2]              # 第一行第三个元素, 第一支股票第三天交易量

# 多维ndarray索引与list相似,都是通过位置进行索引

2.1.3 布尔值索引

#布尔取值;这个是在条件选股非常常用;

code_array = np.array(['000001', '000002', '000003', '000004'])

pe_array = np.array([20, 10, 5, 30])

# 部分数据源返回数据形式与以上代码类似,在code_array中记载股票代码,在pe_array中记载pe值,两个array数据一一对应

# 如‘000001’股票对应pe值为20

# 下行代码通过<=符号判断生成bool值组成的ndarray,如果元素对应的值符合条件,则对应返回bool值为True,否则为False

filtered_array = pe_array <= 10

filtered_array

code_array[filtered_array]    # 返回filtered_array对应为True的股票代码

# 以上过程可简写

code_array[pe_array<=10]

# 多个条件,条件选股;

roe_array = np.array([0.05, -0.10, 0.12 0.15])

# 使用双重条件,选择pe值<=10同时roe>=0的股票

# 注意,此时单个条件需要用括号括起来

filtered_array = (pe_array<=10) & (roe_array>=0)

filtered_array

# 以上过程可简写

code_array[(pe_array<=10) & (roe_array>=0)]

# 选取并集,选择pe值小于等于10或roe大于等于0的股票

# 此时用|表示或

code_array[(pe_array<=10) | (roe_array>=0)]

2.2 向量化操作

Ndarray很重要因为它提供了可以批处理数据而不需要写任何for循环;这叫做vectorization;

Python List对比

return_list = [0.01, 0.12, 0.3, 0.06, -0.05]

向量化计算

return_array = np.array([0.01, 0.12, 0.3, 0.06, -0.05])    # 来自持股stock1的每日收入情况

return_array + return_array   

return_array * leverage_array

return_array / leverage_array

return_array * 2

以上运算中,参与运算的都是两个ndarray数据结构,并且数据结构shape相同,在进行元素级操作时,相同位置的元素进行了某种运算。

代码性能对比

data_array = np.random.standard_normal(1000000)     

data_list =  list(data_array)

%timeit [i*2 for i in data_list]

%timeit 2 * data_array

广播 Broadcasting

Ndarray创建方法补充

r = np.random.standard_normal((4, 3))

s = np.random.standard_normal((4, 3))

np.random.seed(100)                              # 锁定产生的随机数

s = np.random.standard_normal((4, 3))

Python function和Numpy的结合

def standardize(factor):

    return (factor - factor.mean())/factor.std()

stock_pe = np.array([[15,16,15,17,16],        # 假设为不同行业不同股票的pe

                    [50,53,57,56,58],

                    [20,18,19,17,15]])

standardize(stock_pe)

2.3 ndarray形状调整、拼接

g = np.linspace(1, 15, 15)

np.arange(10).reshape(2,5)

g = np.linspace(1, 15, 15).reshape((3,5))

np.resize(g, (3, 2)) 

h.T          #转置

n.transpose()    #和上面效果类似;

n.flatten()    #把所有元素用一维数组返回;

3. Numpy的函数与方法

3.1 通用函数

3.1.1 一元通用函数

传入一个ndarray,对每一个元素进行相应运算。

求绝对值

return_array = np.array([0.05, 0.10, -0.05, 0.15, 0.10])

np.abs(return_array)

求平方根

a = np.array([1,2,3,4,5])

np.sqrt(a)

# 相反,可用np.square求各元素平方

3.1.2 二元通用函数

基本数学运算:如+,-,求余等

np.array([5,7]) % np.array([2,7])

基本比较运算:如大于,小于,大于等于等

np.array([1,2,3]) > np.array([4,1,2])

np.array([1,2,3]) >= 2

基本逻辑运算:并、或

np.array([True, False]) & np.array([False, True])

np.array([True, False]) | np.array([False, True])

3.1.3 数学统计方法

求和

position = np.array([1000,1200,1100,1300,1300])          # 某日策略对各股票持仓数量

position.sum() 

均值

close_price_array = np.array([10, 11, 13, 12, 14])

np.mean(close_price_array)

标准差

close_price_array = np.array([10, 11, 13, 12, 14]) 

close_price_array.std()

最大最小值及其索引

close_price_array.max()

close_price_array.min()

close_price_array.argmax()

累积计算

# 累积和

income_array = np.array([10, 20, 30, 40])

# 累积积

daily_return = np.array([0.1,0.05, -0.01, 0.02])

daily_return + 1

(daily_return + 1).cumprod()   

3.1.4 其他重要函数

#np.where  非常重要

factor = np.random.randn(3,5)

signal = np.where(factor > 0.2, 1, 0)          # 在计算策略的signal时非常有用;将factor>0.2的标记为1,其余标记为0,由此可作为策略信号

#np.all 和 np.any

np.any(np.array([True, False]))      # 检查是否存在一个True

np.all(np.array([True, False]))      # 检查是否全部为True

4. 求解线性方程

4.1 用numpy求解方程

a⋅x=b

a11⋅x1+a21⋅x1=b1

a12⋅x2+a22⋅x2=b2

首先,矩阵 a 的数据

a = np.array([[3, 1], [1, 2]])

然后, 矩阵 b的数据

b = np.array([9, 8])

最后, 求解过程.

x = np.linalg.solve(a, b)

np.dot(a, x)  # checking,矩阵的计算;np.dot Ndarry矩阵乘法运算;

4.2 Numpy 矩阵运算

a = np.matrix([[3, 1], [1, 2]])

x = np.matrix([[2],[4]])

a * x        #因为是矩阵matrix的数据类型,乘法就是矩阵相乘,而不是向量化运算;

矩阵乘法2

a = np.array([[3,1],[1,2]])

x = np.array([2,4])

a.dot(x)

5. Numpy随机数

5.0 np.random.standard_normal()

np.random.standard_normal()  # 产生单个随机数

np.random.standard_normal(5)  # 产生1d array

a = np.random.standard_normal((2, 6))  # 2d array,两维数组,2行6列;

np.round(a, 3)          #四舍五入,保留3位小数;

5.1 numpy.random.rand()

numpy.random.rand(d0,d1,...,dn)

rand函数根据给定维度生成[0,1)之间的数据,包含0,不包含1

dn表格每个维度

返回值为指定维度的array

np.random.rand(4,2)

5.2 numpy.random.random

random函数根据给定维度生成[0,1)之间的数据,包含0,不包含, 和random.rand的区别是参数传递需要通过list或者tuple

z = np.random.random((4,2))

5.3 numpy.random.randn()

numpy.random.randn(d0,d1,...,dn)

randn函数返回一个或一组样本,具有标准正态分布。

dn表格每个维度

返回值为指定维度的array

np.random.seed(10)

np.random.randn(2,4)

5.4 numpy.random.randint()

numpy.random.randint(low, high=None, size=None, dtype='l')

返回随机整数,范围区间为[low,high),包含low,不包含high

参数:low为最小值,high为最大值,size为数组维度大小,dtype为数据类型,默认的数据类型是np.int

high没有填写时,默认生成随机数的范围是[0,low)

np.random.randint(-5,6,size=(5,6))

5.5 numpy.random.seed()

np.random.seed()的作用:使得随机数据可预测。 当我们设置相同的seed,每次生成的随机数相同。如果不设置seed,则每次会生成不同的随机数

np.random.seed(10)

np.random.rand(5)

5.6 numpy.random.choice()

numpy.random.choice(a, size=None, replace=True, p=None)

从给定的一维数组中生成随机数

参数: a为一维数组类似数据或整数;size为数组维度;p为数组中的数据出现的概率

a为整数时,对应的一维数组为np.arange(a)

import numpy as np

np.random.choice(5,20)

demo_list = ['000001', '000002','000003','000004', '000005']

np.random.choice(demo_list,size=(5,3), p=[0.1,0.1,0.1,0.1,0.6])

6. 用Numpy进行回归运算

求回归系数除了可以用Numpy的函数以外,用statsmodels或者sk-learn也是可以很快求出来的;但是追根溯源,sk-learn也是用的numpy来求的;

6.1 使用 np.polyfit返回回归结系数

m = np.array([1,2,3,4,5])

n = m * 5 + 2

reg = np.polyfit(m, n ,1)

#unpacked

slope, intercept =  np.polyfit(m, n ,1)

6.2 使用np.polyval返回计算结果

np.polyval([ 2.,  6.,  9.], 1)      #2 * 1 ** 2 + 6 * 1 +9

np.random.seed(10)

a = np.random.standard_normal((2, 8))

reg1 = np.polyfit(a[0], a[1], 1)  # 线性回归重点掌握

reg2 = np.polyfit(a[0], a[1], 2)

reg3 = np.polyfit(a[0], a[1], 3)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339

推荐阅读更多精彩内容