numpy模块的基本操作

NUMPY模块

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。即快速, 方便的科学计算基础库(主要时数值的计算, 多维数组的运算);
数组:存储的时同一种数据类型;
****主要适用于对数字类型进行运用

创建数组以及设置数组的数据类型
import numpy as np
# 1. numpy中如何创建数组(矩阵)?
# 方法1:
a=np.array([1,2,3,4])
b=np.array([2,3,4,6])
print(a+b)
#这个时候数组的相加为对应元素相加

#方法2:
c1 = np.arange(1,6)
print(c1)

# 数组的类名: numpy.ndarray
print(type(c1))

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

# 2. 修改数组的数据类型
print(c1.astype('float'))
print(c1.astype('bool'))
print(c1.astype('?'))  # ?是bool类型的代号;

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

# 3. 修改浮点数的小数位数
c3 = np.array([1.234556, 3.45464456, 5.645657567])
print(np.round(c3, 2))

在这里插入图片描述

numpy读取csv文件(逗号分隔符文件)
import numpy as np
fname='doc/student.txt'
dtype=np.dtype([('gender', '|S1'), ('height', 'f2')])
# fname: 文件的名称, 可以是文件名, 也可以是ugz或者bz2的压缩文件;
# dtype: 数据类型, 可选, 默认是float;
# delimiter: 分隔符字符串, 默认情况是任何的空格,
# skiprows: 跳过前xx行, 一般情况跳过第一行;
#  usecols: 读取指定的列, 可以是元组;
# unpack: 如果为True, 对返回的数组对象转置;
date=np.loadtxt(fname=fname,dtype=dtype,skiprows=9,usecols=(1,3),unpack=True)
print(date)

在这里插入图片描述

numpy数组的转置
import numpy as np

# 将一维数组转换为3行4列的二维数组
data = np.arange(12).reshape((3, 4))
print('data\n',data)

#进行行列转置
#1.)直接转换
print('data转换1:\n',data.transpose())

# 2). 0轴 , 1 轴
# - 轴的理解(axis): 0轴, 1轴, 2轴
# - 一维数组: [1,2,3,45]    ----0轴
# - 二维数组: [[1,2,3,45], [1,2,3,45]]     ----0轴, 1轴,
print('data转换2:\n',data.swapaxes(1, 0))

#3).numpy内置方法
print('data转换3:\n',data.T)

在这里插入图片描述

numpy的索引和切片
import numpy as np

# 将一维数组转换为3行4列的二维数组
data = np.arange(12).reshape((3, 4))
print(data)

# 取第一行的数据
print('第一行的数据\n',data[0])

#  取第一列的数据
print('第一列的数据\n',data.T[0])
print('第二列的数据\n',data[:, 1])

# 获取多行
print('前两行\n',data[:2])

# 获取多行列
print('每行前两列\n',data.T[:2])
print('每行前两列\n',data[:, :2])


# 获取指定行的前几列;

print('指定1,3行的前2列\n',data[[0,2], :2])
print('指定前两行的1,3列\n',data[:2, [0,2]])

在这里插入图片描述

numpy中数值的修改
import numpy as np

# 将一维数组转换为3行4列的二维数组
data = np.arange(12).reshape((3, 4))
print(data)

# 取第一行的数据,全部修改为零
data[0] = 0
print('第一行的数据,全部修改为零\n',data)

# 获取第一列,全部修改为零
data = np.arange(12).reshape((3, 4))
data.T[0] = 0
print('第一列,全部修改为零\n',data)

# 布尔索引: 复杂的条件: data中所有大于8的数字都替换为0;
data = np.arange(12).reshape((3, 4))
data[data>8] = 0
print('布尔索引1\n',data)

# 复杂的条件: data中所有大于8的数字都替换为0, 否则替换为1; a>b?a:b
data = np.arange(12).reshape((3, 4))
print('布尔索引2\n',np.where(data <= 8, 1, 0))#--->data[data<=8] = 1 and data[data>8] = 0

# 裁剪: 如果data<=8, 替换称8, 如果data>=10, 替换为10;
data = np.arange(12).reshape((3, 4))
print('裁剪替换:\n',data.clip(8, 10))

在这里插入图片描述

数组的拼接及行列交换
import numpy as np
t1 = np.arange(12).reshape(2, 6)
t2 = np.arange(12).reshape(2, 6)
t3 = np.arange(12).reshape(2, 6)

# 数组的拼接
# 竖直拼接(vertically)
print('竖直拼接\n',np.vstack((t1, t2, t3)))
# 水平拼接(horizontally)
print('水平拼接\n',np.hstack((t1, t2, t3)))

# 数组的行列交换
t4 = np.arange(12).reshape(2, 6)
# 行交换(第一行和第二行进行交换)
print("原数据:\n", t4)
t4[[0, 1], :] = t4[[1, 0], :]
print("行替换后的数据:\n", t4)

# 列交换(第3列和第5列进行交换
t4[:, [2, 4]] = t4[:, [4, 2]]
print("列替换后的数据:\n", t4)

在这里插入图片描述

numpy常用的方法
import numpy as np

# 将一维数组转换为3行4列的二维数组
data = np.arange(12).reshape((3, 4))
#第一行的第一列赋值为80
data[0, 0] = 80
print('第一行的第一列赋值为80\n',data)
# 1. 获取最大值和最小值的位置;
# 获取当前数组里面最大值的索引;
max_item1 = np.argmax(data)
print('最大值的索引',max_item1)
# 获取每一列的最大值对应的索引;
print('每一列的最大值对应的索引',np.argmax(data, axis=0))
# 获取每一行的最大值对应的索引;
print('每一行的最大值对应的索引',np.argmax(data, axis=1))

# 2. 创建一个全为0的数组;
print('全为0的数组\n',np.zeros((3, 3), dtype=np.int))

# 3. 创建一个全为1的数组;
print('全为1的数组\n',np.ones((3, 4)))

# 4. 创建一个对角线全为1的正方形数组(方阵)
print('对角线全为1的正方形数组\n',np.eye(3))

在这里插入图片描述

numpy的深拷贝和浅拷贝
>>> import numpy as np
>>> data = np.arange(8).reshape(2,4)
>>> id(data)
139969554126288
>>> id(data[0])
139969554127168

#data1和data的id是一样的,所以完全不复制
#两个变量相互影响, 指向同一块内存空间;
>>> data1 = data
>>> id(data1)
139969554126288

#data2与data的id不一样,但是里边的数据id一样,两个的数据变化是一致的;
#即为浅拷贝,保存的地址是一样的
>>> data2 = data[::]
>>> id(data2)
139969554126848
>>> id(data2[0])
139969554127168

#data3与data的不一样,数据的id也不一样,故内存地址也不一样,两个变量不互影响;
#即为浅拷贝
>>> data3 = data.copy()
>>> id(data3)
139969554127248
>>> id(data3[0])
139969554127008
numpy中的nan和inf
nan(not a number): 表示不是一个数字, 代表的是数据缺失
inf(infinity): inf代表正无穷, -inf代表负无穷


# nan的特殊属性:
    - 两个nan的值是不相等的, 是float类型:
    >>> np.nan == np.nan
    False

    >>> np.nan != np.nan
    True
"""
import numpy as np

# 判断有多少个缺失值:
data = np.arange(12, dtype=np.float).reshape(3, 4)
data[:2, 2] = np.nan
data[0,0]=np.inf
print(data)
#判断data里面的哪一个是缺失值
#data!=data---->np.isnan(data)
print('缺失值个数:',np.count_nonzero(data!=data))

在这里插入图片描述

numpy的常用统计函数
import numpy as np
data = np.arange(12, dtype=np.float).reshape(3, 4)

print(data)
# 求和
print('总和',data.sum())
# 每一列数据的和;
print('每一列的和',data.sum(axis=0))
# 每一行数据的和;
print('每一行的和',data.sum(axis=1))

# - 均值
print('所有的均值',data.mean())
print('每一列均值',data.mean(axis=0))
print('每一行均值',data.mean(axis=1))

# - 中值
print('所有的中值',np.median(data))
print('每一列中值',np.median(data, axis=0))
print('每一行中值',np.median(data, axis=1))

# - 最大值
print('所有的最大值',data.max())
print('每一列最大值',data.max(axis=0))
print('每一行最大值',data.max(axis=1))

# - 最小值
print('所有的最小值',data.min())
print('每一列最小值',data.min(axis=0))
print('每一行最小值',data.min(axis=1))

# - 极差
print('所有的极差',np.ptp(data))
print('每一列极差',np.ptp(data, axis=0))
print('每一行极差',np.ptp(data, axis=1))

# - 标准差: 代表的是数据的波动稳定情况, 数字越大, 越不稳定;
print('所有的标准差',data.std())
print('每一列标准差',data.std(axis=0))
print('每一行标准差',data.std(axis=1))

#- 方差
print('所有的方差',data.var())
print('每一列方差',data.var(axis=0))
print('每一行方差',data.var(axis=1))

在这里插入图片描述

案例分析

获取所有男生的身高, 求平均值;获取所有女生的身高, 求平均值;并绘制柱状图显示

import numpy as np
from pyecharts import Bar
#读取文件中所需要的列
fname='doc/student.txt'
dtype=np.dtype([('gender', '|S1'), ('height', 'f2')])
data=np.loadtxt(fname=fname,dtype=dtype,skiprows=9,usecols=(1,3))
print('学生信息',data)
# 判断是否性别为那男的表达式
isMale = data['gender'] == b'M'
male_avg_height = data['height'][isMale].mean()
female_avg_height = data['height'][~isMale].mean()
print('男生的身高平均值%s,女生的身高平均值%s'%(male_avg_height, female_avg_height))
bar = Bar(title="不同性别身高的平均值")
bar.add("", ["男", '女'], [male_avg_height, female_avg_height])
bar.render()

在这里插入图片描述
在这里插入图片描述
获取所有男生的体重, 求平均值;获取所有女生的体重, 求平均值;并绘制柱状图显示

import numpy as np
from pyecharts import Bar
def parser_weight(weight):
    # 对于体重数据的处理, 如果不能转换为浮点数据类型, 则返回缺失值;
    try:
        return float(weight)
    except ValueError as e:
        return -99

fname = "doc/student.txt"
dtype = np.dtype([('gender', '|S1'),  ('weight', 'f2')])
data = np.loadtxt(fname=fname, dtype=dtype, skiprows=9,
                  usecols=(1,  4), converters={ 4:parser_weight})
                  
# 判断是否性别为男
isMale = data['gender'] == b'M'

# 判断体重是否有缺失值
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('男生的体重平均值%s,女生的体重平均值%s'%(male_avg_weight, female_avg_weight))

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

在这里插入图片描述

基于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. 平均收盘价最低,最高分别为星期几
import numpy as np

params1=dict(
    fname='doc/data.csv',
    delimiter=',',
    usecols=(6,7),
    unpack=True
)
# 收盘价,成交量
endprice,countnum=np.loadtxt(**params1)
#weights为加权项
VWAP=np.average(endprice,weights=countnum)
print('1. 计算成交量加权平均价格:',VWAP)

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

# 最高价的最大值和最小值的差值;----(极差)
print('3.最高价的极差',np.ptp(highprice))
# 最低价的最大值和最小值的差值;----(极差)
print('3.最低价的极差',np.ptp(lowerprice))

# 计算收盘价的中位数
print('4.收盘价的中位数',np.median(endprice))

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

#简单收益率:相邻两个价格之间的变化率。
simple_re=np.diff(endprice)
print('6.简单收益率',simple_re)
# 对数收益率: 所有价格取对数后两两之间的差值。
log_re=np.diff(np.log(endprice))
print("6. 对数收益率:", log_re)
# 年波动率等于对数收益率的标准差除以其均值,再乘以交易日的平方根,通常交易日取252天。
year_vol=log_re.std()/log_re.mean()*np.sqrt(252)
print("6. 年波动率:",  year_vol)
#  月波动率等于对数收益率的标准差除以其均值,再乘以交易月的平方根。通常交易月取12月。
month_vol = log_re.std()/log_re.mean()*np.sqrt(12)
print("6. 月波动率:", month_vol)


def get_week(date):
    """根据传入的日期28-01-2011获取星期数, 0-星期一"""
    from datetime import datetime
    # 默认传入的不是字符串, 是bytes类型;
    date=date.decode('utf-8')
    #返回的是数字0-4,分别对应的是周一到周五
    return datetime.strptime(date,'%d-%m-%Y').weekday()

params3=dict(
    fname="doc/data.csv",
    delimiter=",",
    usecols=(1, 6),
    converters={1: get_week},
    unpack=True
)
# 星期数和收盘价
week, endPrice = np.loadtxt(**params3)
weekchange={0:'星期一',1:'星期二',2:'星期三',3:'星期四',4:'星期五'}
allsave=[]
for weekdays in range(5):
    #当文件中week属性都为0时,所有的价格求均值,依次便利
    average=endprice[week==weekdays].mean()
    #周一到周五的平均收盘价依次保存
    allsave.append(average)
    #k值对应的values取星期
    print("7. %s的平均收盘价:%s" % (weekchange[weekdays], average))



# 平均收盘价最低,最高分别为星期几
# 由数组中最大值或最小值拿出索引值,从而拿出对应的values值
print('8.平均收盘价最低是',weekchange[np.argmin(allsave)])
print('8.平均收盘价最高是',weekchange[np.argmax(allsave)])

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/GLH_2236504154/article/details/87925051