Numpy_03的逻辑运算与统计运算

逻辑运算

学习目标

  • 目标
    • 应用数组的通用判断函数
    • 应用np.where实现数组的三元运算
  • 应用
    • 股票涨跌幅数据逻辑运算

一、问题?

如果我们想要判断获取涨幅大于0.5一写区段?

数据准备:

In [1]: import numpy as np
 
In [2]: # 创建一个符合正态分布的500个股票504天的涨跌幅数据
   ...: stock_day_rise = np.random.normal(0, 1, (500, 504))
 
In [3]: # 获取前4个股票的前5个交易日的涨跌幅数据
   ...: temp = stock_day_rise[:4, :5]
 
In [4]: temp
Out[4]: 
array([[ 0.17017797,  1.59886728, -2.21765447, -1.53094694, -0.85290083],
       [-0.31448824,  2.33438872, -0.24909789, -0.68732532, -1.04854607],
       [-0.15111815, -0.80393376, -0.35471297, -0.31424869,  0.03501344],
       [ 0.7933363 ,  0.75446854,  0.20604597,  0.7818697 ,  0.42365234]])

二、逻辑运算

In [5]: # 判断获取涨幅大于0.5的区段
   ...: temp > 0.5
Out[5]: 
array([[False,  True, False, False, False],
       [False,  True, False, False, False],
       [False, False, False, False, False],
       [ True,  True, False,  True, False]])
 
In [6]: # 赋值
   ...: temp[temp > 0.5] = 1
 
In [7]: temp
Out[7]: 
array([[ 0.17017797,  1.        , -2.21765447, -1.53094694, -0.85290083],
       [-0.31448824,  1.        , -0.24909789, -0.68732532, -1.04854607],
       [-0.15111815, -0.80393376, -0.35471297, -0.31424869,  0.03501344],
       [ 1.        ,  1.        ,  0.20604597,  1.        ,  0.42365234]])

三、通用判断函数

  • np.all()
In [8]: # 判断temp是否全是上涨的
   ...: np.all(temp > 0)
Out[8]: False
  • np.unique()

返回新的数组的数值,不存在重复的值

In [9]: # 将序列中数值唯一且不重复的值组成新的序列,比如(1,1,2,2)就返回(1,2)
   ...: change_int = stock_day_rise[0:2, 0:5].astype(int)
   ...: np.unique(change_int)
Out[9]: array([-2, -1,  0,  1])

四、np.where(三元运算符)

通过使用np.where能够进行更加复杂的运算

  • np.where()
np.where(temp > 0, 1, 0)
  • 复合逻辑需要结合np.logical_and和np.logical_or使用
In [12]: # 判断前四个股票前五天的涨跌幅 大于0.5并且小于1的,换为1,否则为0
    ...: np.where(np.logical_and(temp > 0.5, temp < 1), 1, 0)
Out[12]: 
array([[0, 0, 0, 1, 0],
       [1, 0, 0, 0, 0],
       [0, 0, 0, 1, 1],
       [0, 0, 1, 0, 0]])
 
In [13]: # 判断前四个股票前五天的涨跌幅 大于0.5或者小于-0.5的,换为1,否则为0
    ...: np.where(np.logical_or(temp > 0.5, temp < -0.5), 1, 0)
Out[13]: 
array([[1, 0, 0, 1, 0],
       [1, 1, 1, 0, 1],
       [0, 0, 1, 1, 1],
       [0, 0, 1, 0, 1]])

统计运算

学习目标

  • 目标
    • 使用np.max完成最大值计算
    • 使用np.min完成最小值计算
    • 使用np.mean完成平均值计算
    • 使用np.std完成标准差计算
    • 使用np.argmax、np.argmin完成最大值最小值的索引
  • 应用
    • 股票涨跌幅数据统计

一、问题?

为什么需要统计运算?

二、统计指标

在数据挖掘/机器学习领域,统计指标的值也是我们分析问题的一种方式。常用的指标如下:

  • min(a[, axis, out, keepdims]) Return the minimum of an array or minimum along an axis.
  • max(a[, axis, out, keepdims]) Return the maximum of an array or maximum along an axis.
  • median(a[, axis, out, overwrite_input, keepdims]) Compute the median along the specified axis.
  • mean(a[, axis, dtype, out, keepdims]) Compute the arithmetic mean along the specified axis.
  • std(a[, axis, dtype, out, ddof, keepdims]) Compute the standard deviation along the specified axis.(标准差:表示波动情况)
  • var(a[, axis, dtype, out, ddof, keepdims]) Compute the variance along the specified axis. (方差:表示离散程度)

三、股票涨跌幅统计运算

进行统计的时候,axis 轴的取值并不一定,Numpy中不同的API轴的值都不一样,在这里,axis 0代表列, axis 1代表行去进行统计

# 接下来对于这4只股票的4天数据,进行一些统计运算
# 指定行 去统计
print("所有四只股票前四天的最大涨幅{}".format(np.max(temp, axis=1)))
# 使用min, std, mean
print("所有四只股票前100天的最大跌幅{}".format(np.min(temp, axis=1)))
print("所有四只股票前100天的振幅幅度(标准差){}".format(np.std(temp, axis=1)))
print("所有四只股票前100天的平均涨跌幅{}".format(np.mean(temp, axis=1)))

如果需要统计出哪一只股票在某个交易日的涨幅最大或者最小?

  • np.argmax(temp, axis=)
  • np.argmin(temp, axis=)
# 获取股票指定哪一天的涨幅最大
print("前四只股票在100天内涨幅最大{}".format(np.argmax(temp, axis=1)))
print("前100天在天内涨幅最大的股票{}".format(np.argmax(temp, axis=0)))

统计运算案例:

import numpy as np
 
# 创建一个符合正态分布的500个股票504天的涨跌幅数据
stock_day_rise = np.random.normal(0, 1, (500, 504))
# 获取前4个股票的前5个交易日的涨跌幅数据
temp = stock_day_rise[:4, :5]
print("前4个股票的前5个交易日的涨跌幅数据:")
print(temp)
 
# 使用max, min, median, std, var, mean对这4只股票的5天数据,进行一些统计运算
print("所有四只股票前五天的最大涨幅{}".format(np.max(temp, axis=1)))
print("所有四只股票前五天的最大跌幅{}".format(np.min(temp, axis=1)))
print("所有四只股票前五天的中间跌幅{}".format(np.median(temp, axis=1)))
print("所有四只股票前五天的振幅幅度{}".format(np.std(temp, axis=1)))
print("所有四只股票前五天的方差{}".format(np.var(temp, axis=1)))
print("所有四只股票前五天的平均涨跌幅{}".format(np.mean(temp, axis=1)))
 
# 获取股票指定哪一天的涨幅最大
print("前四只股票在5天内涨幅最大{}".format(np.argmax(temp, axis=1)))
print("前5天在天内涨幅最大的股票{}".format(np.argmax(temp, axis=0)))

统计运算结果:

4个股票的前5个交易日的涨跌幅数据:
[[ 0.37310176 -0.80266281  0.49413172  0.03991727  0.66102868]
 [-0.03890735 -0.38157026  0.66343787 -0.33886078 -1.70747026]
 [-1.15137955  0.25203233  3.83837253  0.48185389  1.52012328]
 [-0.54360511 -1.40222036 -1.09703491  1.20309174 -0.90385997]]
所有四只股票前五天的最大涨幅[0.66102868 0.66343787 3.83837253 1.20309174]
所有四只股票前五天的最大跌幅[-0.80266281 -1.70747026 -1.15137955 -1.40222036]
所有四只股票前五天的中间跌幅[ 0.37310176 -0.33886078  0.48185389 -0.90385997]
所有四只股票前五天的振幅幅度[0.51942041 0.77033909 1.66027442 0.91914167]
所有四只股票前五天的方差[0.26979757 0.59342231 2.75651114 0.84482141]
所有四只股票前五天的平均涨跌幅[ 0.15310332 -0.36067415  0.9882005  -0.54872572]
前四只股票在5天内涨幅最大[4 2 2 3]5天在天内涨幅最大的股票[0 2 2 3 2]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值