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

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

import numpy as np
from pyecharts import  Bar
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))
# print(data)
# print(data['gender'])
# print(data['height'])
# print(data['height'][data['gender'] == b'M'].mean())
# print(data['height'][data['gender'] == b'F'].mean())
#


# 判断是否性别为男的表达式
isMale = data['gender'] == b'M'
male_avg_height = data['height'][isMale].mean()
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()

numpy案例应用练习
numpy案例应用练习
需求2:
获取所有男生的体重, 求平均值;获取所有女生的体重, 求平均值;并绘制柱状图显示

    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, 3, 4), converters={4:parser_weight})

# 判断是否性别为男的平均身高
isMale = data['gender'] == b'M'
male_avg_height = data['height'][isMale].mean()
female_avg_height = data['height'][~isMale].mean()
print(male_avg_height, female_avg_height)



# 判断是否性别为男的平均体重
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_height, female_avg_height])
bar.add("体重", ["男", '女'], [male_avg_weight, female_avg_weight])
bar.render()

import numpy as np
from pyecharts import  Bar

#
# def parser_bps(bps):
#     # 对于体重数据的处理, 如果不能转换为浮点数据类型, 则返回缺失值;
#     try:
#
#         bps = bps.decode('utf-8').split('/')
#         print(bps, type(bps))
#         first_bps = float(bps[0])
#         second_bps = float(bps[1])
#         return first_bps, second_bps
#     except ValueError as e:
#         return -99


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案例应用练习

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

题目要求:

    1. 数据格式介绍:
      第4-8列,分别为股票的开盘价,最高价,最低价,收盘价,成交量。
    1. 计算成交量加权平均价格
      概念:成交量加权平均价格,英文名VWAP(Volume-Weighted Average Price,
      成交量加权平均价格)是一个非常重要的经济学量,代表着金融资产的“平均”价格。
      某个价格的成交量越大,该价格所占的权重就越大。VWAP就是以成交量为权重计算出来的加权平均值。np.average(endprice, weights=“成交量”)
    1. 计算股票收益率、年波动率及月波动率
      在投资学中,波动率是对价格变动的一种度量,历史波动率可以根据历史价格数据计算得出。
      计算历史波动率时,需要用到对数收益率。
      对数收益率???
      年波动率等于对数收益率的标准差除以其均值,再乘以交易日的平方根,通常交易日取252天。
      月波动率等于对数收益率的标准差除以其均值,再乘以交易月的平方根。通常交易月取12月。
import numpy as np
import math

params1 =  dict(
    fname= "doc/data.csv",
    delimiter=',',  #内容以‘,’进行分隔
    usecols = (6,7),    #读取第几列
    unpack = True  #对提取的内容进行转置

)
# **从字典中解包
print(np.loadtxt(**params1))    #读取的内容以近似字典的形式
endPrice,countNumber = np.loadtxt(**params1)
WAP = np.average(endPrice,weights = countNumber)
print("1.计算成交量加权平均价格:",WAP)

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

# 4.计算收盘价的中位数
print("4.计算收盘价的中位数:",np.median(countNumber))
# 5.计算收盘价格的方差
print("5.计算收盘价格的方差:",np.var(countNumber))

# 7.星期?的平均收盘价格

def get_week(date):
    from datetime import datetime
    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))

# 8.平均收盘价的最低是星期
print("8.平均收盘价的最低是星期:",np.argmin(allAvg)+1)
print("8.平均收盘价的最高是星期:",np.argmax(allAvg)+1)


# 6.计算简单收益率,对数收益率,年波动率,月波动率
simpleReturn = np.diff(endPrice)
print("计算简单收益率:",simpleReturn)
logReturn = np.diff(np.log(endPrice))
print("计算对数收益率:",logReturn)

annual_vol = logReturn.std()/logReturn.mean()*np.sqrt(252)
print("年波动率:",annual_vol)

month_vol = logReturn.std()/logReturn.mean()*np.sqrt(12)
print("月波动率:",month_vol)

numpy案例应用练习

numpy巩固小练习

  1. 创建一个 5x5 的二维数组,其中边界值为1,其余值为0;
    • np.ones()
    • 切片和索引的赋值
import numpy as np

# 1
data=np.ones((5,5))
print(data)
data[[1,2,3],:]=0
print(data)
data[:,[0,4]]=1
print(data)

numpy案例应用练习
2. 使用数字 0 将一个全为 1 的 5x5 二维数组包围, 效果如下:
array([[0., 0., 0., 0., 0., 0., 0.],
[0., 1., 1., 1., 1., 1., 0.],
[0., 1., 1., 1., 1., 1., 0.],
[0., 1., 1., 1., 1., 1., 0.],
[0., 1., 1., 1., 1., 1., 0.],
[0., 1., 1., 1., 1., 1., 0.],
[0., 0., 0., 0., 0., 0., 0.]])

# 2
data=np.ones((5,5))
data=np.vstack((data,[0,0,0,0,0]))
data=np.hstack((data,[[0],[0],[0],[0],[0],[0]]))
data=np.hstack(([[0],[0],[0],[0],[0],[0]],data))
data=np.vstack(([0,0,0,0,0,0,0],data))
print(data)

numpy案例应用练习

  1. 创建一个 10x10 的二维数组,并使得 1 和 0 沿对角线间隔放置, 效果如下:
    array([[0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
    [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
    [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
    [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
    [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
    [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
    [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
    [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
    [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
    [1, 0, 1, 0, 1, 0, 1, 0, 1, 0]])
# 3
data=np.eye(5,k=0,dtype=np.int)
data[0,[2,4]]=1
data[1,3]=1
data[2,[0,4]]=1
data[3,1]=1
data[4,[0,2]]=1
data=np.vstack((data,data))

print(data)

numpy案例应用练习
4. 创建一个 0-10 的一维数组,并将 (1, 9] 之间的数全部反转成负数, 效果如下:
array([ 0, 1, -2, -3, -4, -5, -6, -7, -8, -9, 10])

# 4
data=np.arange(0,11)
print(data)
data=np.where(data>1,0-(data),data)
data=np.where(data<-9,0-data,data)
print(data)

numpy案例应用练习
5. 创建一个 5x5 的矩阵,其中每行的数值范围从 1 到 5, 效果如下:
array([[1., 2., 3., 4., 5.],
[1., 2., 3., 4., 5.],
[1., 2., 3., 4., 5.],
[1., 2., 3., 4., 5.],
[1., 2., 3., 4., 5.]])

# 5
data=np.ones((5,5))
# print(data)
for i in range(1,5):
    data[:,i]=i+1
print(data)

numpy案例应用练习

  1. 创建一个长度为 5 的一维数组,并将其中最大值替换成 0
# 6
data=np.array([2,3,4,5,6])
print(data)
data[np.argmax(data)]=1
print(data)

numpy案例应用练习
7. 将二维数组的前两行进行顺序交换, 效果如下:

  • 交换前
    [[ 0 1 2 3 4]
    [ 5 6 7 8 9]
    [10 11 12 13 14]
    [15 16 17 18 19]
    [20 21 22 23 24]]

  • 交换后
    [[ 5 6 7 8 9]
    [ 0 1 2 3 4]
    [10 11 12 13 14]
    [15 16 17 18 19]
    [20 21 22 23 24]]


# 7
data=np.array(range(25)).reshape(5,5)
print(data)
data[[0,1],:]=data[[1,0],:]
print(data)

numpy案例应用练习

  1. 找出给定一维数组中非 0 元素的位置索引
## 8
data=np.array([1,0,2,0,6,0])
print(np.where(data!=0))

numpy案例应用练习

9.找出数组中缺失值的总数及所在位置, 案例如下:
array([[0.8 , 0.25, 0.74, 0.05, 0.24, 0.16, 0.63, 0.62, 0.89, 0.85],
[0.61, 0.76, 0.26, 0.3 , 0.82, 0.74, 0.96, 0.64, 0.58, 0.06],
[0.78, 0.38, 0.19, 0.68, 0.75, 0.91, 0.13, 0.24, 0.98, 0.21],
[0.47, 0.12, 0.34, 0.06, 0.46, 0.69, 0.1 , nan, 0.27, 0.92],
[0.83, 0.01, 0.63, 0.15, 0.52, 0.52, 0.02, 0. , 0.74, 0.59],
[0.56, 0.66, 0.15, nan, 0.26, 0.88, 0.15, 0.57, 0.61, 0.35],
[0.33, 0.58, 0.06, 0.94, 0.58, 0.53, 0.97, 0.02, 0.32, nan],
[0.84, 0.71, 0.65, 0.42, 0.44, 0.96, 0.37, 0.65, 0.6 , 0.17],
[0.04, 0.94, 0.92, nan, 0.7 , 0.38, 0.28, 0.45, 0.35, 0.93],
[0.38, 0.69, 0.43, 0.01, 0.67, 0.46, 0.73, 0.99, 0.94, 0.45]])
缺失值总数:
4
缺失值索引:
(array([3, 5, 6, 8]), array([7, 3, 9, 3]))

# 9
data=np.array([[0.8 , 0.25, 0.74, 0.05, 0.24, 0.16, 0.63, 0.62, 0.89, 0.85],
       [0.61, 0.76, 0.26, 0.3 , 0.82, 0.74, 0.96, 0.64, 0.58, 0.06],
       [0.78, 0.38, 0.19, 0.68, 0.75, 0.91, 0.13, 0.24, 0.98, 0.21],
       [0.47, 0.12, 0.34, 0.06, 0.46, 0.69, 0.1 ,  np.nan, 0.27, 0.92],
       [0.83, 0.01, 0.63, 0.15, 0.52, 0.52, 0.02, 0.  , 0.74, 0.59],
       [0.56, 0.66, 0.15,  np.nan, 0.26, 0.88, 0.15, 0.57, 0.61, 0.35],
       [0.33, 0.58, 0.06, 0.94, 0.58, 0.53, 0.97, 0.02, 0.32,  np.nan],
       [0.84, 0.71, 0.65, 0.42, 0.44, 0.96, 0.37, 0.65, 0.6 , 0.17],
       [0.04, 0.94, 0.92,  np.nan, 0.7 , 0.38, 0.28, 0.45, 0.35, 0.93],
       [0.38, 0.69, 0.43, 0.01, 0.67, 0.46, 0.73, 0.99, 0.94, 0.45]])
# print(np.count_nonzero(data!=data))
#
print(np.where(np.isnan(data)))

numpy案例应用练习

相关文章: