Numpy的统计分析

时间:2021-08-18 16:54:04

 
  1. '''----------------------保存数据savetxt-----------------------'''
  2. import numpy as np
  3. example = np.arange(24).reshape(3,8)
  4. '''
  5. 将numpy的ndarray数组保存到文本文件中:
  6. savetxt(fileName,data)
  7. fileName:保存文件路径和名称
  8. data:需要保存的数据
  9. '''
  10. np.savetxt("./data/example.txt",example)
  11. print("保存完成~")
 
  1. '''---------------------加载数据loadtxt-----------------------'''
  2. import numpy as np
  3. '''
  4. numpy加载csv文件数据
  5. np.loadtxt(filepath,delimiter,usecols,converters,unpack)
  6. filepath:加载文件的路径
  7. delimiter:数据文件的分隔符
  8. usecols:加载数据文件中数据列索引
  9. unpack:当加载多列数据时是否需要将数据列进行解耦赋值给不同的变量
  10. converters:{},第一个参数为要加载的数据是第几列,第二个参数是对数据操作的函数或表达式
  11. '''
  12. result = np.loadtxt('data/data.csv',delimiter=",",usecols=(6,7))
  13. print(result)
  14. #从result中切片分别取出收盘价和成交量
  15. close = result[:,0]
  16. print("收盘价:\n",close)
  17. amount = result[:,1]
  18. print("成交量:\n",amount)
  19. #当加载csv文件的多列数据时可以使用unpack将加载的数据列进行解耦到不同的数组中
  20. arr1,arr2 = np.loadtxt('data/data.csv',delimiter=",",usecols=(6,7),unpack=True)
  21. print("收盘价:\n",arr1)
  22. print("成交量:\n",arr2)
  23. #加载收盘价并将数据转化为整数
  24. close = np.loadtxt("data/data.csv",delimiter=",",usecols=(6),
  25. converters={6:lambda x: int(float(x))})
  26. print(close)
 
  1. '''---------------------数组的属性-----------------------'''
  2. import numpy as np
  3. example = np.arange(24).reshape(3,4,2)
  4. #01->ndim数组的维度
  5. print("01维度:",example.ndim) #3
  6. #02->size数组元素的个数
  7. print("02元素个数:",example.size) #24
  8. #03->len
  9. print("03元素个数:",len(example)) #3
  10. #04->itemsize数组中的元素在内存中所占的字节数
  11. print("每个元素在内存中所占的字节数:",example.itemsize) #int32/8=4
  12. #05->nbytes整个数组所占的存储空间/字节数
  13. print("整个数组所占的存储空间/字节数:",example.nbytes) #24*4=96
  14. print("整个数组所占的存储空间/字节数:",example.size*example.itemsize) #24*4=96
  15. #06->T数组的转置结果
  16. print("原数组:\n",example) #3x4x2
  17. print("转置结果:\n",example.T) #2x4x3
  18. #07->real复数数组的实部
  19. comp = np.array([2+5j,6+3j,4+2j])
  20. real = comp.real
  21. print("复数数组的实部是:\n",real) #[2. 6. 4.]
  22. #08->imag复数数组的虚部
  23. imag = comp.imag
  24. print("复数数组的虚部是:",imag) # [5. 3. 2.]
  25. #09求comp复数数组的每个元素的模
  26. print("复数数组的每个元素的模是:",np.sqrt(real**2+imag**2)) #[5.38516481 6.70820393 4.47213595]
  27. iterator = np.arange(9).reshape(3,3)
  28. #10将数组展平成扁平迭代器
  29. result = iterator.flat
  30. for item in result:
  31. print(item) #0 1 2 3 4 5 6 7 8
 
  1. '''---------------数组的分割split/hsplit/vsplit/dsplit------------'''
  2. import numpy as np
  3. #数组的分割
  4. full = np.arange(9).reshape(3,3)
  5. print(full)
  6. #np.split 当axis=0则是按行进行分割
  7. axis0 = np.split(full,3,axis=0)
  8. print(axis0[0]) #[[0 1 2]]
  9. print(axis0[0].shape) #(1,3)
  10. print(axis0[1]) #[[3 4 5]]
  11. print(axis0[2]) #[[6 7 8]]
  12. #np.split 当axis=1则是按列进行分割
  13. axis1 = np.split(full,3,axis=1)
  14. print(axis1)
  15. #hsplit(arg,num),与np.split当axis=1一样水平分割与按列分割一样
  16. axis2 = np.hsplit(full,3)
  17. print(axis2)
  18. #vsplit(arg,num),与np.split当axis=0一样垂直分割与按行分割一样
  19. axis3 = np.vsplit(full,3)
  20. print(axis3)
  21. #2x2x2
  22. d3 = np.arange(8).reshape(2,2,2)
  23. print("d3:\n",d3)
  24. #dsplit深度分割,dsplit only works on arrays of 3 or more dimensions
  25. dsplit = np.dsplit(d3,2)
  26. print(dsplit)
  27. print(dsplit[0]) #2x2x1
  28. print(dsplit[1]) #2x2x1
  29. #2x2x6
  30. d4 = np.arange(24).reshape(2,2,6)
  31. print("d4:\n",d4)
  32. #dsplit深度分割,dsplit only works on arrays of 3 or more dimensions
  33. dsplit = np.dsplit(d4,2)
  34. print(dsplit)
  35. print(dsplit[0]) #2x2x1
  36. print(dsplit[1]) #2x2x1


  1. '''---------------股票波动率------------'''
  2. import numpy as np
  3. close = np.loadtxt("data/data.csv",delimiter=",",usecols=(6))
  4. #计算简单的收益率:相邻两天的差除以前一天的价格
  5. returns = np.diff(close)/close[:-1]
  6. print(returns)
  7. #对数收益率
  8. #对所有收盘价取对数
  9. logClose = np.log(close)
  10. print("收盘价的对数:",logClose)
  11. diffLogClose = np.diff(logClose)
  12. print("收盘价的对数收益率:",diffLogClose)
  13. #对数收益率的标准差
  14. std = np.std(diffLogClose)
  15. print("对数收益率的标准差",std)
  16. #计算年波动率
  17. annual_volatility = std/np.mean(diffLogClose)
  18. year_volatility = annual_volatility/np.sqrt(1/252)
  19. print("年波动率是:",year_volatility)
  20. #计算月波动率
  21. month_volatility = annual_volatility/np.sqrt(1/12)
  22. print("月波动率是:",month_volatility)
 
  1. '''---------------统计方法average/mean/max/min------------'''
  2. import numpy as np
  3. #加载收盘价和成交量
  4. close,amount = np.loadtxt("data/data.csv",delimiter=",",
  5. usecols=(6,7),unpack=True)
  6. print("收盘价:\n",close)
  7. print("成交量:\n",amount)
  8. #01->成交量加权平均价:np.average(ndarray,weights)
  9. aver = np.average(close,weights=amount)
  10. print("成交量加权平均价:",aver)
  11. #02->收盘价算数平均值:np.mean(ndarray) np.average(ndarray)
  12. mean = np.mean(close)
  13. average = np.average(close) #350.5895493532009
  14. print("收盘价算数平均值:",mean) #351.0376666666667
  15. print("收盘价算数平均值:",average) #351.0376666666667
  16. #03->求最大值最小值 np.max(ndarray) np.min(ndarray)
  17. #求成交量最大值和最小值
  18. maxAmount = np.max(amount)
  19. print("最大成交量:",maxAmount)
  20. minAmount = np.min(amount)
  21. print("最小成交量:",minAmount)
  22. example = np.arange(24).reshape(2,3,4)
  23. print(example)
  24. print(np.max(example))
  25. print(np.min(example))
  26. #自定义一个函数获取数组的最大值最小值
  27. def getMaxandMin(ndarray):
  28. max,min = ndarray[0],ndarray[0]
  29. result = ndarray.flat #先展平
  30. for item in result:
  31. if item>max:
  32. max = item
  33. if item<min:
  34. min = item
  35. return max,min
  36. max,min = getMaxandMin(example)
  37. print(max,min)
 
  1. '''---------------统计方法ptp/median/var/repeat---------------'''
  2. import numpy as np
  3. #04->计算数组的极差(最大值和最小值的差值 ) np.ptp
  4. high = np.loadtxt("data/data.csv",delimiter=",",usecols=(4))
  5. print(high)
  6. #计算最高价的极差
  7. ptp = np.ptp(high)
  8. print("最高价的极差",ptp)
  9. #利用最大值最小值得到极差
  10. max = np.max(high)
  11. min = np.min(high)
  12. ptp2 = max - min
  13. print("ptp2:",ptp2)
  14. #05->计算收盘价的中位数 np.median()
  15. close = np.loadtxt("data/data.csv",delimiter=",",usecols=(6))
  16. print(close)
  17. median = np.median(close)
  18. print("收盘价的中位数:",median)
  19. list(close)
  20. # print(close)
  21. close.sort()
  22. print(close)
  23. if close.size%2 !=0:
  24. median1 = close[(close.size-1)/2]
  25. else:
  26. median1 = (close[int(close.size/2)]+close[int(close.size/2)-1])/2
  27. print(median1)
  28. #06->计算数据样本的方差 np.var()
  29. print("收盘价的方差:",np.var(close))
  30. open = np.loadtxt("data/data.csv",delimiter=",",usecols=(3))
  31. print("开盘价的方差:",np.var(open))
  32. #07->np.repeat()
  33. a = np.array([1,3,5])
  34. times = np.array([4,6,2])
  35. b = np.repeat(a,times)
  36. print(b) #[1,1,1,1,3,3,3,3,3,3,5,5]
 
  1. '''---------------统计方法prod/cumprod/compress---------------'''
  2. import numpy as np
  3. #1.求阶乘 np.prod
  4. arr = np.array([5,2,7,4])
  5. prod = np.prod(arr)
  6. print("阶乘:",prod) # 5*2*7*4=280
  7. #2.累积乘积 np.cumprod()
  8. cumArr = np.array([2,3,4,5])
  9. cumprod = np.cumprod(cumArr)
  10. print(cumprod) #[ 2 6 24 120]
  11. #3.将数组中所有比num1小的元素设为num1,
  12. # 所有比num2大的元素设为num2,
  13. # 介于num1和num2之间的数值保持不变 np.clip(num1,num2)
  14. test = np.array([3,56,7,44,22,18])
  15. print("clip",test.clip(48,20)) #clip [48 20 48 48 48 48]与num1比小,与num2比大
  16. #4.np.compress()返回根据一定条件筛选后的数组
  17. close = np.loadtxt("data/data.csv",delimiter=",",usecols=(6))
  18. #计算对数收益率
  19. logReturns = np.diff(np.log(close))
  20. print("对数收益率:",logReturns)
  21. #筛选出对数收益率中大于0 的元素
  22. mask = logReturns>0
  23. print("mask索引:",mask)
  24. result= logReturns.compress(mask)
  25. print("对数收益率中大于0 的元素:",result)
 
  1. '''---------------数组数据的筛选---------------'''
  2. import numpy as np
  3. close = np.loadtxt("data/data.csv",delimiter=",",usecols=(6))
  4. #对数收益率
  5. logReturns = np.diff(np.log(close))
  6. print(logReturns)
  7. #筛选出对数收益率大于0的所有元素的索引
  8. indices= np.where(logReturns>0)
  9. print("对数收益率大于0的索引为:",indices)
  10. #根据索引值,获取相应的数组元素
  11. result = np.take(logReturns,indices)
  12. print(result)
 
  1. '''---------------日期格式转化---------------'''
  2. from datetime import datetime
  3. dateStr = "2018-5-28"
  4. newdate = datetime.strptime(dateStr,"%Y-%m-%d")
  5. print(newdate) #2018-05-28 00:00:00
  6. #获取dateStr日期对应的星期
  7. weekday = newdate.date().weekday()
  8. print(type(weekday))
  9. print("{}是星期{}".format(dateStr,weekday+1)) #2018-5-28是星期1
 
  1. '''---------------案例---------------'''
  2. import numpy as np
  3. from datetime import datetime
  4. #将日期格式字符串转化得到星期数
  5. def datestr2num(s):
  6. print(type(s))
  7. # 加载过来的第一列日期数据是bytes类型,需转化为str
  8. return datetime.strptime(s.decode("utf8"),"%d-%m-%Y").date().weekday()
  9. #converters参数:“1”表示要转化的是第一列数据,datestr2num是指使用哪个函数做转化
  10. dates,close = np.loadtxt("data/data.csv",delimiter=",",usecols=(1,6),
  11. converters={1:datestr2num},unpack=True)
  12. print("日期:",dates)
  13. print("收盘价:",close)
  14. aver = []
  15. for i in range(5):
  16. #根据星期数条件得到一个mask数组
  17. mask = dates==i
  18. #根据mask数组筛选出星期数为i的所有的收盘价
  19. weekday = close.compress(mask)
  20. #计算出星期数为i的所有收盘价的均值
  21. dayAver = np.mean((weekday))
  22. #将星期数为i的收盘价的均值添加到aver数组中
  23. aver.append(dayAver) #aver里存的是周一到周五各个的平均值
  24. print(aver)
  25. #获取数组中最大值的索引
  26. maxIndex = np.argmax(aver)
  27. minIndex = np.argmin(aver)
  28. print("星期{}的平均收盘价最高".format(maxIndex+1))
  29. print("星期{}的平均收盘价最低".format(minIndex+1))