Python数据分析--Numpy常用函数介绍(2)
摘要:本篇我们将以分析历史股价为例,介绍怎样从文件中载入数据,以及怎样使用NumPy的基本数学和统计分析函数、学习读写文件的方法,并尝试函数式编程和NumPy线性代数运算,来学习NumPy的常用函数。
一、文件读入 :读写文件是数据分析的一项基本技能
CSV(Comma-Separated Value,逗号分隔值)格式是一种常见的文件格式。通常,数据库的转存文件就是CSV格式的,文件中的各个字段对应于数据库表中的列。
NumPy中的 loadtxt 函数可以方便地读取CSV文件,自动切分字段,并将数据载入NumPy数组。
1、保存或创建新文件
import numpy as np i = np.eye(3) #eye(n)函数创建n维单位矩阵
print(i)
np.savetxt('test.txt', i) #savetxt()创建并保存test.txt文件
savetxt()函数,如果有已经文件则更新,如目录中没有,则创建并保存test.txt文件
运行结果如下:
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
2、读取csv文件的函数loadtxt
1)先在保存程序的目录下创建一个名称为data.csv的文件,并设置数据如下图:

2)读取文件,如下:
c,v=np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True)
usecols 的参数是一个元组,以获取第7字段至第8字段的数据,也就是上述文件中 股票的收盘价和成交量数据。 unpack 参数设置为 True ,是分拆存储不同列的数据,即分别将收盘价和成交量的数组赋值给变量c和v。
3、常见的函数
成交量加权平均、时间加权、算术平均值、中位数、方差等
import numpy as np i = np.eye(3) #eye(n)函数创建n维单位矩阵
print(i)
np.savetxt('test.txt', i) #savetxt创建并保存test.txt文件 #读取csv文件
c,v=np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True)
"""usecols 的参数为一个元组,以获取第7字段至第8字段的数据,也就是股票的收盘价和成交量数据。 unpack 参数设置为 True ,是分拆存储不同列的数据,即分别将收
盘价和成交量的数组赋值给变量c和v"""
vwap = np.average(c, weights=v) #调用了average函数,将v作为权重参数使用,
print(vwap)
print('\n')
print( np.mean(c)) #算术平均值
print('\n')
t = np.arange(len(c))
print( t )
print('\n')
twap =np.average(c, weights=t) #按时间权重
print( twap )
print('\n')
h,l=np.loadtxt('data.csv',delimiter=',', usecols=(4,5), unpack=True)
# 获取第4字段至第5字段的数据,即股票的最高价和最低价 print ( np.max(h)) #获取最大值max()
print ( np.min(l)) #获取最小值min()
print('\n')
print( np.ptp(h) ) # 用ptp()函数计算了极差,即最大值和最小值之间的差值
print( np.ptp(l) )
print('\n')
print( np.median(c)) # 中位数median()函数,即多个数据中,处于中间的数
print( np.msort(c))#msort(( ))函数对价格数组进行排序,可以验证上述中位数
#方差的计算
variance = np.var(c) #方差函数var()
print(variance)
用代码、excel进行相关计算,运行结果如下:
为后面计算,将data.csv中的数据多增加几行,修改如下并保存(为后面日期读写与修改,日期形式修改成如下):
603112,2022-4-1,,13.56,13.97,13.55,13.87,3750000
603112,2022-4-2,,13.75,14.25,13.69,14.03,4003500
603112,2022-4-3,,13.69,14.11,13.61,13.95,3956500
603112,2022-4-4,,14.3,14.3,13.73,13.89,4250000
603112,2022-4-5,,14.1,14.5,13.93,14,4013500
603112,2022-4-6,,14.5,15.4,14.35,15.4,9056500
603112,2022-4-7,,16,16.94,15.85,16.94,3750000
4、股票的收益率等
股市中最常见的就是涨幅,也就是今日收盘价相对昨日涨跌的比例,即 (今日收盘价-昨天收盘价)/昨日收盘价*100,numpy中的 diff() 函数可以返回一个由相邻数组元素的差值构成的数组,由于相邻数据相减,因此diff()数组数据较原数组少一个。
如上述修改后,有7天的收盘价,diff()计算出的结果就只有6位,
import numpy as np #读取csv文件
c,v=np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True) #股票的简单收益率
# diff 函数可以返回一个由相邻数组元素的差值构成的数组
results = np.diff(c)
print(results)
print('\n')
results1 = np.diff(c)/c[:-1]*100 #相对前一天的涨幅
print(results1)
print('\n')
Standard_deviation =np.std(results) # 计算出标准差
print(Standard_deviation)
运行结果,代码、excel进行相比较:

5、对数收益与波动率
1)对数收益:log 函数得到每一个收盘价的对数,再对结果使用 diff 函数即可,
logreturns = np.diff( np.log(c) )
print(logreturns)
运行结果:
[ 0.01146966 -0.00571839 -0.00431035 0.00788817 0.09531018 0.09531018]
2) where的作用
where 函数可以根据指定的条件返回所有满足条件的序列索引值,比如上述logreturns中有两个小于0的数据。
posretindices = np.where(results1 > 0)
print('Indices with positive returns1',posretindices)
运行结果:
Indices with positive returns1 (array([0, 3, 4, 5], dtype=int64),)
3)波动率:波动率=对数收益率的标准差除以其均值,再除以交易周期倒数的平方根。下面代码分别为以年、月进行统计的波动率.
annual_volatility =(np.std(logreturns)/np.mean(logreturns))/np.sqrt(1./252.)#使用浮点数才能得到正确的结果
print ( annual_volatility )
#月波动率
month_volatility =(np.std(logreturns)/np.mean(logreturns))/np.sqrt(1./12.)
print ( month_volatility )
6、日期分析
处理日期总是很烦琐。NumPy是面向浮点数运算的,因此需要对日期做一些专门的处理。
通过上述代码,我们知道,修改函数np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True)中的参数 usecols=(6,7)就可以读取不同的列,日期是在第2列,即下标应该为1(数列下标是从0开始的),可以重新定义新日期数列并获取后存入。
代码如下:
dates, c=np.loadtxt('data.csv', delimiter=',', usecols=(1,6), unpack=True) #读取下标为1、6的数据,分别存入到dates和c数列中。
但实际运行过程中会报错,

代码需要作如下修改:
import numpy as np
from datetime import datetime def datestr2num(s): #定义一个函数
return datetime.strptime(s.decode('ascii'),"%Y-%m-%d").date().weekday()
#decode('ascii') 将字符串s转化为ascii码 #读取csv文件
dates,close=np.loadtxt('data.csv',delimiter=',', usecols=(1,6),converters={1:datestr2num},unpack=True)
print(dates)
运行结果:[4. 5. 6. 0. 1. 2. 3.],也是从0开始,到6结束。为了更好地说明数据,可以采用真实的数据,即从通信达软件直接下载真实的交易数据,如下图所示:

(注意:较原来少了一列空格列)
修改代码如下:
import numpy as np
from datetime import datetime def datestr2num(s): #定义一个函数
return datetime.strptime(s.decode('ascii'),"%Y-%m-%d").date().weekday()
#decode('ascii') 将字符串s转化为ascii码 #读取csv文件
dates,c=np.loadtxt('data.csv',delimiter=',', usecols=(1,5),
converters={1:datestr2num},unpack=True)
print(dates) print(len(dates)) #统计导出的天数
运行结果:

如上图,导出有420天数据。
按周一到周五,统计相关数据:
averages = np.zeros(5) #创建包含5个元素的数组,保存交易日收盘价,0-4分别代表周一到周五五个交易日
for i in range(5): #遍历0到4的日期标识
indices =np.where(dates==i) #where函数得到各工作日的索引值并存储在 indices 数组
prices=np.take(c,indices) #take函数获取各个工作日的收盘价。
avg= np.mean(prices) #每个工作日计算出平均值存放在 averages 数组
averages[i] = avg #每个工作日计算出平均值存放在 averages 数组
print('day', i)
#print('prices', prices)
print("Average", avg) print(averages)
当然除了上述外,还可以求得420天里的最大值、最小值以及交易日平均值中最大值、最小值等,对代码进行如下修:
import numpy as np
from datetime import datetime def datestr2num(s): #定义一个函数
return datetime.strptime(s.decode('ascii'),"%Y-%m-%d").date().weekday()
#decode('ascii') 将字符串s转化为ascii码 #读取csv文件
dates,c=np.loadtxt('data.csv',delimiter=',', usecols=(1,5),
converters={1:datestr2num},unpack=True) averages = np.zeros(5) #创建包含5个元素的数组,保存交易日收盘价,0-4分别代表周一到周五五个交易日
for i in range(5): #遍历0到4的日期标识
indices =np.where(dates==i) #where函数得到各工作日的索引值并存储在 indices 数组
prices=np.take(c,indices) #take函数获取各个工作日的收盘价。
avg= np.mean(prices)
averages[i] = avg #每个工作日计算出平均值存放在 averages 数组,共有5个数值
print('day', i)
#print('prices', prices)
print("Average", avg) print(averages)
print('\n') print('the top close price:',np.max(c)) #最高收盘价
print('the low close price:',np.min(c)) #最低收盘价
print('\n') top = np.max(averages) #找出averages数列中的最大值
print ("Highest average", top)
print ("Top day of the week", np.argmax(averages)) #argmax函数返回的是averages数组中最大元素的索引值
print('\n') bottom = np.min(averages) #找出averages数列中的最小值
print ("Lowest average", bottom)
print ( "Bottom day of the week", np.argmin(averages))#argmin函数返回的是averages数组中最小元素的索引值
运行结果如下:

本篇初步导入了真实的股票交易信息,并利用numpy常见函数对进行了初步的计算,列举了下列常用函数:
loadtxt() 函数可以方便地读取CSV文件,自动切分字段,并将数据载入NumPy数组。
savetxt()创建并保存test.txt文件
np.loadtxt('data.csv', delimiter=',', usecols=(6,7),)usecols参数用来选择读取的数列
np.average(c, weights=v) 加权平均,将v作为权重参数使用,
np.mean(c)) #算术平均值
np.max(h)) #获取最大值max()
np.min(l)) #获取最小值min()
np.ptp(h) ) 用ptp()函数计算了极值差,
np.median(c)) 中位数median()函数,即多个数据中,处于中间的数
np.msort(c))函数对价格数组进行排序,
np.var(c) 方差函数var()
np.diff(c) 函数可以返回一个由相邻数组元素的差值构成的数组
np.std(results) # 标准差
np.diff( np.log(c) )
np.where(results1 > 0) 选择
np.sqrt()#平方根sqrt(),浮点数
s.decode('ascii') 将字符串s转化为ascii码
np.take(c,indices) #take函数获取各个工作日的收盘价。
np.argmax(averages)) #argmax函数返回数组中最大元素的索引值
np.argmin(averages))#argmin函数返回数组中最小元素的索引值
下一篇将介绍股市中常见的几个指标线,如移动均线、布林线等。
Python数据分析--Numpy常用函数介绍(2)的更多相关文章
- Python数据分析--Numpy常用函数介绍(4)--Numpy中的线性关系和数据修剪压缩
摘要:总结股票均线计算原理--线性关系,也是以后大数据处理的基础之一,NumPy的 linalg 包是专门用于线性代数计算的.作一个假设,就是一个价格可以根据N个之前的价格利用线性模型计算得出. 前一 ...
- Python数据分析--Numpy常用函数介绍(5)--Numpy中的相关性函数
摘要:NumPy中包含大量的函数,这些函数的设计初衷是能更方便地使用,掌握解这些函数,可以提升自己的工作效率.这些函数包括数组元素的选取和多项式运算等.下面通过实例进行详细了解. 前述通过对某公司股票 ...
- Python数据分析--Numpy常用函数介绍(6)--Numpy中矩阵和通用函数
在NumPy中,矩阵是 ndarray 的子类,与数学概念中的矩阵一样,NumPy中的矩阵也是二维的,可以使用 mat . matrix 以及 bmat 函数来创建矩阵. 一.创建矩阵 mat 函数创 ...
- Python数据分析--Numpy常用函数介绍(9)-- 与线性代数有关的模块linalg
numpy.linalg 模块包含线性代数的函数.使用这个模块,可以计算逆矩阵.求特征值.解线性方程组以及求解行列式等.一.计算逆矩阵 线性代数中,矩阵A与其逆矩阵A ^(-1)相乘后会得到一个单位矩 ...
- Python数据分析--Numpy常用函数介绍(6)--Numpy中与股票成交量有关的计算
成交量(volume)是投资中一个非常重要的变量,它是指在某一时段内具体的交易数,可以在分时图中绘制,包括日线图.周线图.月线图甚至是5分钟.30分钟.60分钟图中绘制. 股票市场成交量的变化反映了资 ...
- Python数据分析--Numpy常用函数介绍(3)
摘要:先汇总相关股票价格,然后有选择地对其分类,再计算移动均线.布林线等. 一.汇总数据 汇总整个交易周中从周一到周五的所有数据(包括日期.开盘价.最高价.最低价.收盘价,成交量等),由于我们的数据是 ...
- Python数据分析--Numpy常用函数介绍(9)--Numpy中几中常见的图形
在NumPy中,所有的标准三角函数如sin.cos.tan等均有对应的通用函数. 一.利萨茹曲线 (Lissajous curve)利萨茹曲线是一种很有趣的使用三角函数的方式(示波器上显示出利萨茹曲线 ...
- Python数据分析-Numpy数值计算
Numpy介绍: NumPy是高性能科学计算和数据分析的基础包.它是pandas等其他各种工具的基础. NumPy的主要功能: 1)ndarray,一个多维数组结构,高效且节省空间 2)无需循环对整组 ...
- Python数据分析——numpy基础简介
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:基因学苑 NumPy(Numerical Python的简称)是高性 ...
随机推荐
- 一整套PCB设计流程和要点,老板再也不怕我出错!
资料输入阶段 1. 在流程上接收到的资料是否齐全(包括:原理图.*.brd文件.料单.PCB设计说明以及PCB设计或更改要求.标准化要求说明.工艺设计说明文件) 2. 确认PCB模板是最新的 3. 确 ...
- .NET Core Ecosystem
.NET .NET Blog Application Models Web Mobile Desktop Microservices Gaming Machine Learning Cloud Int ...
- HTML5中dialog元素尝鲜
对话框(别称模态框,浮层)是web项目中用于用户交互的重要部分,我们最常见的就是js中 alert(),confirm(),但是这个对话框的不美观,也不能自定义样式,所以在开发的过程中,一般根据自己自 ...
- java中对象属性可以是另外一个对象或对象的参考
7.对象的属性可以是另外一个对象或对象的参考 通过这种方法可以迅速构建一个比较大的系统. class Motor { Light[] lights; Handle left, ri ...
- Android控件设置半透明+EditText设置默认值+ 控件居中
Android控件设置半透明 效果 代码: android:background="#50FFFFFF" 50表示50%透明 Android:EditText设置默认值 andro ...
- 正则、字符类Pattern、Matcher类
字符类 * [abc] a.b 或 c(简单类) * [^abc] 任何字符,除了 a.b 或 c(否定) * [a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围) * [0-9 ...
- Linux下编写和加载 .ko 文件(编写linux驱动)
一..ko 文件介绍 .ko文件是kernel object文件(内核模块),该文件的意义就是把内核的一些功能移动到内核外边, 需要的时候插入内核,不需要时卸载. 二.优点 (1)这样可以缩小内核体积 ...
- mosquitto使用与常用配置
为了方便演示,我这里就用windows环境下安装的mosquitto进行操作,操作方式和linux系统下是一样的. 一.windows安装mosquitto 下载mosquitto mosquitto ...
- LibreOffice(开源免费办公软件)
LibreOffice(开源免费办公软件) 官方地址 中文网站:https://zh-cn.libreoffice.org/ 下载地址: https://zh-cn.libreoffice.org/d ...
- C# 静态常量(const)动态常量(static、readonly)用法区别
C# 常量的命名方法 一个低级错误 readonly.const 代码 使用方式 支持类型 维护性 性能比较 优先使用 C# Static 与 Java Static C# Const 与 Java ...