天天看点

Numpy逻辑&统计运算1 逻辑运算2 通用判断函数3 np.where(三元运算符)4 统计运算

数据准备: 

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]])
           

1 逻辑运算

  • 逻辑判断
  • 赋值
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]])
           

2 通用判断函数

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

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

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

3 np.where(三元运算符)

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

  • np.where()
  • 复合逻辑需要结合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]])
           

4 统计运算

  • 使用np.max完成最大值计算
  • 使用np.min完成最小值计算
  • 使用np.mean完成中间数计算
  • 使用np.std完成标准差计算
  • 使用np.var完成方差计算
  • 使用np.mean完成平均值计算
  • 使用np.argmax、np.argmin完成最大值最小值的索引
注意:axis 0代表列, axis 1代表行去进行统计
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]
           

继续阅读