python--numpy模块

什么是numpy?
快速,方便的科学计算基础库(主要是数值的计算,多维数组的计算)

多维数组轴的理解:0轴,1轴,2轴
一维数组:[1 , 2 , 3 , 4] -----只有0轴
二维数组:[[1 , 2 , 3 , 4] , [1, 2 , 3 , 4]] ------0轴和1轴(横向和纵向)

注: 下面的所有np都为numpy,import numpy as np

1.numpy中如何创建数组?

方法1:
a=np.array([1 , 2 , 3 , 4 , 5])
a=np.array(range(1,6))
方法2:
a=np.arange(1,6)

数组的类名:numpy.ndarray

查看数据元素的类型
print(a.dtype)

2.修改数组的数据类型

a.astyle(’ float ‘)
a.astyle(’ bool ‘)
a.astyle(’ ? ') # ?是布尔类型的代号;

创建的时候指定数据类型
a=np.array([1 , 2 , 3 , 4] , dtype=np.float)

修改浮点数的小数位数
a=np.array([1.12345 , 2.23456 , 3.45678])
print(’ np.round(c3,2) ')

numpy的读取操作

fname: 文件的名称, 可以是文件名, 也可以是ugz或者bz2的压缩文件;
dtype: 数据类型, 可选, 默认是float;
delimiter: 分隔符字符串, 默认情况是任何的空格,
skiprows: 跳过前xx行, 一般情况跳过第一行;
usecols: 读取指定的列, 可以是元组;
unpack: 如果为True, 对返回的数组对象转置;

import numpy as np
fname = "doc/eg6-a-student-data.txt"
dtype = np.dtype([('gender', '|S1'), ('height', 'f2')])
data = np.loadtxt(fname=fname, dtype=dtype, skiprows=9, usecols=(1, 3), unpack=True)
print(data)

numpy数组的转置

#创建一个三行四列的数组
data=np.arange(12),reshape(3,4)

方法1:
data.transpose()

方法2:0轴,1轴交换
data.swapaxes(1 , 0)

方法3:
data.T

numpy的索引和切片

#生成3行,4列的二维数组
data = np.arange(12).reshape((3, 4))

#取第一行的数据
data[0]

#取第一列的数据
data.T[0]
data[:, 1]

#获取多行
data[:2]

#获取多行列
data.T[:2]
data[:, :2]

#获取指定行的前几列;
data[[0,2], :2]
data[:2, [0,2]]

numpy中数值的修改

data = np.arange(12).reshape((3, 4))

布尔索引 所有大于8都替换称0
data[data>8]=0

所有大于8替换为0否则为1:
data[data<=8]=1
data[data>8]=0

print(np.where(data<=8,1,0))

裁剪:小于8替换为8,大于10 替换为10
print(data.clip(8,10))

数组的拼接:
t1=np.arange(12).reshape(2,6)
t2=np.arange(12).reshape(2,6)
t3=np.arange(12).reshape(2,6)
#竖直拼接
print(np.vstack((t1,t2,t3)))
#水平拼接
print(np.hstack((t1,t2,t3)))

数组的行列交换
t4=np.arange(12).reshape(2,6)
#行交换
t4[[0,1],:]=t4[[1,0],:]
#列交换
t4[:,[2,4]]=t4[:,[4,2]]

numpy常用的方法

data = np.arange(12).reshape((3, 4))
data[0, 0] = 80

1. 获取最大值和最小值的位置;

(1). 获取当前数组里面最大值的索引;
max_item1 = np.argmax(data)

(2).获取每一列的最大值对应的索引;
print(np.argmax(data, axis=0))
(3).获取每一行的最大值对应的索引;
print(np.argmax(data, axis=1))

2.创建一个全为0的数组;

print(np.zeros((3, 3), dtype=np.int))

3. 创建一个全为1的数组;

print(np.ones((3, 4)))

4. 创建一个对角线全为1的正方形数组(方阵)

print(np.eye(3))

numpy中的深拷贝与浅拷贝

numpy中的拷贝:
data1=data :完全不复制,两个变量相互影响,指向的是同一块内存空间;
data2=data[ : : ] :会创建新的对象data2,但是data的数据完全由data2保管,两个数据变化是一致的;
data3=data.copy() : 深拷贝,两个变量互不影响。

numpy中的nan和inf

nan(not a number): 表示不是一个数字,代表的是数据缺失
inf(infinity): inf代表正无穷,-inf代表负无穷。

nan的特殊属性:
两个nan值是不相等的,是float类型;
np.nan!=np.nan True

判断有多少个缺失值:
np.count_nonzero(data!=data) 输出个数
或 data!=data 输出每个值的bool

判断data里面的缺失值:
np.count_nonzero(np.isnan(data))

numpy中的常用数据统计函数

data = np.arange(12, dtype=np.float).reshape(3, 4)

  1. 求和
    #所有和
    data.sum()
    #每一列数据的和
    data.sum(axis=0)
    #每一行数据的和
    data.sum(axis=1)

  2. 均值
    #所有均值
    data.mean()
    #每一列数据的均值
    data.mean(axis=0)
    #每一行数据的均值
    data.mean(axis=1)

  3. 中值
    #所有中值
    np.median(data)
    #每一列数据的中值
    np.median(data,axis=0)
    #每一行数据的中值
    np.median(data,axis=1)

  4. 最大值/最小值
    #所有最大值/最小值
    data.max()/data.min()
    #每一列数据的最大值/最小值
    data.max(axis=0)/data.min(axis=0)
    #每一行数据的最大值/最小值
    data.max(axis=1)/data.min(axis=1)

  5. 极差
    #所有极差
    data.ptp()
    #每一列数据的极差
    data.ptp(axis=0)
    #每一行数据的极差
    data.ptp(axis=1)

6.标准差
#所有标准差
data.std()
#每一列数据的标准差
data.std(axis=0)
#每一行数据的标准差
data.std(axis=1)

案例

需求1:从文件中获取男生的身高求平均值;获取女生的身高求平均值;并绘制柱状图显示

import numpy as np 
from pyecharts import Bar
#fname为文件名
fname='文件名.txt'
#文件中性别为字符串格式,身高为浮点
# i1,u1:有符号和无符号的8位整数(1个字节)
# i2,u2 : 有符号和无符号的16位整数
# i4,u4 :有符号和无符号的32位整数
# i8,u8:有符号和无符号的64位整数
# f2:半精准浮点数
# f4或f : 标准的单精准浮点数,与C的float兼容
# f8或d : 标准的双精准浮点数,与C的double和Python的float对象兼容
# ? : 存储True和False值的布尔类型
dtype=np.dtype(('gender' , 'S1') , ( 'height' , 'f2'))
# 读取文件
data=np.loadtxt(fname=fname,dtype=dtype,skiprows=9,usecols=(1,3))
# 判断性别是否为男
isMale=data[' gender ']==b'M'
# gender为男性的数值的平均值
male_avg_height = data['height'][isMale].mean()
# gender不为男性(女性)的数值的平均值
female_avg_height = data['height'][~isMale].mean()
print(male_avg_height,female_avg_height )

# 绘制柱状图
bar=Bar(title=" 不同性别身高的平均值 ")
bar.add("",[" 男 " , " 女 "],[ male_avg_height,female_avg_height ])
bar.render()

需求2:获取所有男生的体重, 求平均值;获取所有女生的体重, 求平均值;并绘制柱状图显示

# 由于体重一列中存在缺失值nan,所以构造一个函数,将缺失值转化为-99
def parser_weight(weight):
    # 对于体重数据的处理, 如果不能转换为浮点数据类型, 则返回缺失值;
    try:
        return  float(weight)
    except ValueError as e:
        return  -99
fname = "doc/eg6-a-student-data.txt"
dtype = np.dtype([('gender', '|S1'), ('height', 'f2'), ('weight', 'f2')])
data = np.loadtxt(fname=fname, dtype=dtype, skiprows=9,usecols=(1, 4), converters={4:parser_weight})

# 判断是否性别为男的平均体重
is_weight_vaild =  data['weight'] > 0   # 缺失值不计入运算平均值中
male_avg_weight = data['weight'][isMale & is_weight_vaild].mean()
female_avg_weight = data['weight'][~isMale & is_weight_vaild].mean()
print(male_avg_weight, female_avg_weight)

bar = Bar(title="不同性别体重的平均值")
bar.add("", ["男", '女'], [male_avg_weight, female_avg_weight])
bar.render()

numpy案例2

基于numpy的股价统计分析应用
data.csv文件中存储了股票的信息, 其中第4-8列,即EXCEL表格中的D-H列,
分别为股票的开盘价,最高价,最低价,收盘价,成交量。
分析角度:
1. 计算成交量加权平均价格
概念:成交量加权平均价格,英文名VWAP(Volume-Weighted Average Price,成交量加权平均价格)是一个非常重要的经
济学量,代表着金融资产的“平均”价格。
某个价格的成交量越大,该价格所占的权重就越大。VWAP就是以成交量为权重计算出来的加权平均值。
2. 计算最大值和最小值: 计算股价近期最高价的最大值和最低价的最小值
3. 计算股价近期最高价的最大值和最小值的差值;----(极差)
计算股价近期最低价的最大值和最小值的差值
4. 计算收盘价的中位数
5. 计算收盘价的方差
6. 计算对数收益率, 股票收益率、年波动率及月波动率
收盘价的分析常常是基于股票收益率的。
股票收益率又可以分为简单收益率和对数收益率。
简单收益率:是指相邻两个价格之间的变化率。
对数收益率:是指所有价格取对数后两两之间的差值。
# [1, 2,3 4] ======>[-1, ]
使用的方法: NumPy中的diff函数可以返回一个由相邻数组元素的差值构成的数组。
不过需要注意的是,diff返回的数组比收盘价数组少一个元素。
在投资学中,波动率是对价格变动的一种度量,历史波动率可以根据历史价格数据计算得出。计算历史波动率时,需要用
到对数收益率。
年波动率等于对数收益率的标准差除以其均值,再乘以交易日的平方根,通常交易日取252天。
月波动率等于对数收益率的标准差除以其均值,再乘以交易月的平方根。通常交易月取12月。
7. 获取该时间范围内交易日周一、周二、周三、周四、周五分别对应的平均收盘价
8. 平均收盘价最低,最高分别为星期几

# 需求1
import numpy as  np
params1=dict(
fname="doc/data.csv",
delimiter="," ,
usecols=(6,7) ,
unpack=True
)
endPrice , countNum=np.loadtxt(**params1)
VWAP=np.average(endPrice,weights=countNum)
print('成交量加权平均价格%s' %(VWAP))


# 需求2
params2=dict(
fname='doc/data.csv',
delimiter="," ,
usecols=(4,5),
unpack=True
)
highPrice,lowPrice=np.loadtxt(**params2)
print('最高价的最大值:' ,highPrice.max())
print('最低值的最小值:   ' , lowPrice.min())

# 需求3
print("近期最高价的极差: ", np.ptp(highPrice))
print("近期最低价的极差: ", np.ptp(lowPrice))

# 需求4
print("计算收盘价的中位数:", np.median(countNum))

# 需求5
print("计算收盘价的方差:", np.var(endPrice))

猜你喜欢

转载自blog.csdn.net/qq_37037438/article/details/87892245