python--numpy模块

这篇博客详细介绍了numpy模块,包括数据读取、数组转置、索引切片、数值修改、深浅拷贝以及nan和inf的处理。通过学生身高体重和股票数据分析案例,展示了numpy在统计分析中的应用,如计算VWAP、极差、中位数、方差、对数收益率、波动率等,并探讨了不同交易日的平均收盘价分析。
摘要由CSDN通过智能技术生成

什么numpy?

快速, 方便的科学计算基础库(主要时数值的计算, 多维数组的运算);
轴的理解(axis): 0轴, 1轴, 2轴

  • 一维数组: [1,2,3,45] ----0轴
  • 二维数组: [[1,2,3,45], [1,2,3,45]] ----0轴, 1轴,

“”"

import numpy as np


# 1. numpy中如何创建数组(矩阵)?
# 方法1:
a = np.array([1,2,3,4,5])
b = np.array([1,2,3,4,5])
c1 = np.array(range(1,6))
print(a+b)



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


# 数组的类名: 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读取数据

  • 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数组的转置

import numpy as np

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


# 1).
print(data.transpose())

# 2). 0轴 , 1 轴
print(data.swapaxes(1, 0))

# 3).
print(data.T)

在这里插入图片描述

numpy的索引和切片

import numpy as np

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

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

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

# 获取多行
print(data[:2])

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


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

numpy中数值的修改

import numpy as np

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

# # 取第一行的数据
# data[0] = 0
# print(data)
#
# # 获取多行列
# data.T[:2] = 0
# print(data)


# # 布尔索引: 复杂的条件: data中所有大于8的数字都替换为0;
# # 返回一个三行四列的数组, 存储的是Bool值
# print(data>8)
# data[data>8] = 0
# print(data)


# 复杂的条件: data中所有大于8的数字都替换为0, 否则替换为1; a>b?a:b
# print(data)
# data[data<=8] = 1
# data[data>8] = 0
# print(data)
print(np.where(data <= 8, 1, 0))

# 裁剪: 如果data<=8, 替换称8, 如果data>=10, 替换为10;
print(data)
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)

# 竖直拼接(vertically)
print(np.vstack((t1, t2, t3)))
# 水平拼接(horizontally)
print(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列进行交换)
print("原数据:\n", t4)
t4[:, [2, 4]] = t4[:, [4, 2]]
print("替换后的数据:\n", t4)

numpy中的常用方法

import numpy as np

# 将一维数组转换为3行4列的二维数组
data = np.arange(12).reshape((3, 4))
data[0, 0] = 80
print(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(np.zeros((3, 3), dtype=np.int))

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

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

numpy的深拷贝和浅拷贝

列表的深拷贝和浅拷贝
- 浅拷贝: a= b[::] a = copy.copy(b)
- 深拷贝: a = copy.deepcopy(b)

  • numpy中的拷贝
    • data1 = data: 完全不复制, 两个变量相互影响, 指向同一块内存空间;

    • data2 = data[::], 会创建新的对象data2,
      但是data的数据完全由data2保管, 两个的数据变化是一致的;

    • data3 = data.copy(), 深拷贝, 两个变量不湖影响;

        import numpy as np
        data = np.arange(8).reshape(2,4)
        data
        array([[0, 1, 2, 3],
               [4, 5, 6, 7]])
        data1 = data
        id(data)
        140444611238448
        id(data1)
        140444611238448
        data2 = data[::]
        id(data)
        140444611238448
        id(data2)
        140444621241360
        id(data[0])
        140444621241200
        id(data2[0])
        140444620515568
        data
        array([[0, 1, 2, 3],
               [4, 5, 6, 7]])
        data2
        array([[0, 1, 2, 3],
               [4, 5, 6, 7]])
        np.where(data2<4,4,10)
        array([[ 4,  4,  4,  4],
               [10, 10, 10, 10]])
        data2
        array([[0, 1, 2, 3],
               [4, 5, 6, 7]])
        data2[0] = 0
        data2
        array([[0, 0, 0, 0],
               [4, 5, 6, 7]])
        data
        array([[0, 0, 0, 0],
               [4, 5, 6, 7]])
        data3 = data.copy()
        data
        array([[0, 0, 0, 0],
               [4, 5, 6, 7]])
        data3
        array([[0, 0, 0, 0],
               [4, 5, 6, 7]])
        data3[0] = 10
        data3
        array([[10, 10, 10, 10],
               [ 4,  5,  6,  7]])
        data
        array([[0, 0, 0, 0],
               [4, 5, 6, 7]])
      

numpy中的nan和inf

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

nan的特殊属性:

两个nan的值是不相等的, 是float类型:
    >>> np.nan == np.nan
    False

>>> np.nan != np.nan
True

- 如何判断有多少个缺失值:

    data = np.arange(12, dtype=np.float).reshape(3, 4)
    data
    array([[ 0.,  1.,  2.,  3.],
           [ 4.,  5.,  6.,  7.],
           [ 8.,  9., 10., 11.]])
    data[:2, 2] = np.nan
    data
    array([[ 0.,  1., nan,  3.],
           [ 4.,  5., nan,  7.],
           [ 8.,  9., 10., 11.]])
    np.count_nonzero(data!=data)
    2
    data!=data
    array([[False, False,  True, False],
           [False, False,  True, False],
           [False, False, False, False]])

    # 判断data里面的缺失值
    np.isnan(data)
    array([[False, False,  True, False],
           [False, False,  True, False],
           [False, False, False, False]])

    np.count_nonzero(np.isnan(data))
    2



data[np.isnan(data)]=0

测试:

import numpy as np

print(np.nan)
print(np.inf)
print(-np.inf)

在这里插入图片描述

numpy的常用统计函数

import numpy as np
data = np.arange(12, dtype=np.float).reshape(3, 4)
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(data)
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(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))

numpy学生身高体重统计分析的案例

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

fname = "doc/eg6-a-student-data.txt"
dtype = np.dtype([('gender', '|S1'),  ('bpd', 'f2')])
data = np.loadtxt(fname=fname, dtype=dtype, skiprows=9,
                  usecols=(1,  6), converters={ 6:parser_bpd})

print(data)

在这里插入图片描述

numpy案例–基于numpy的股价统计分析应用

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

在投资学中,波动率是对价格变动的一种度量,历史波动率可以根据历史价格数据计算得出。计算历史波动率时,需要用
到对数收益率。
年波动率等于对数收益率的标准差除以其均值,再乘以交易日的平方根,通常交易日取252天。
月波动率等于对数收益率的标准差除以其均值,再乘以交易月的平方根。通常交易月取12月。
7. 获取该时间范围内交易日周一、周二、周三、周四、周五分别对应的平均收盘价
8. 平均收盘价最低,最高分别为星期几

import numpy as np

print("**********************************************")

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

print("**********************************************")
params2 = dict(
    fname="doc/data.csv",
    delimiter=",",
    usecols=(4, 5),
    unpack=True)
# 最高价和最低价
highPrice, lowPrice = np.loadtxt(**params2)

# 最高价的最大值和最低价的最小值
print("2.最高价的最大值: ", highPrice.max())
print("2.最低价的最小值: ", lowPrice.min())

print("**********************************************")
# 计算股价近期最高价的最大值和最小值的差值;----(极差)
#     计算股价近期最低价的最大值和最小值的差值

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

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

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

print("**********************************************")
def get_week(date):
    """根据传入的日期28-01-2011获取星期数, 0-星期一"""
    from datetime import datetime
    # 默认传入的不是字符串, 是bytes类型;
    date = date.decode('utf-8')
    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)
allAvg = []
for weekday in range(5):
    average = endPrice[week == weekday].mean()
    allAvg.append(average)
    print("7. 星期%s的平均收盘价:%s" % (weekday + 1, average))



print("**********************************************")
# [12, 23, 34, 45, 56]
print("8.平均收盘价最低是星期", np.argmin(allAvg) + 1)
print("8. 平均收盘价最高是星期", np.argmax(allAvg) + 1)


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

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值