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的文件,并设置数据如下图:

Python数据分析--Numpy常用函数介绍(2)

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)

Python数据分析--Numpy常用函数介绍(2)

为后面计算,将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进行相比较:

Python数据分析--Numpy常用函数介绍(2)

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数列中。

但实际运行过程中会报错,

Python数据分析--Numpy常用函数介绍(2)

代码需要作如下修改:

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结束。为了更好地说明数据,可以采用真实的数据,即从通信达软件直接下载真实的交易数据,如下图所示:

Python数据分析--Numpy常用函数介绍(2)

(注意:较原来少了一列空格列)

修改代码如下:

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)) #统计导出的天数

运行结果:

Python数据分析--Numpy常用函数介绍(2)

如上图,导出有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数组中最小元素的索引值

运行结果如下:

Python数据分析--Numpy常用函数介绍(2)

本篇初步导入了真实的股票交易信息,并利用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函数返回数组中最小元素的索引值

下一篇将介绍股市中常见的几个指标线,如移动均线、布林线等。

Original: https://www.cnblogs.com/codingchen/p/16290862.html
Author: PursuitingPeak
Title: Python数据分析–Numpy常用函数介绍(2)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/810391/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Matplotlib–绘图标记

    绘制实心圆标记’o’ 绘制*标记 绘制以坐标点为基准的下实心三角标记 fmt 参数定义了基本格式,如标记、线条样式和颜色。格式fmt = ‘[m…

    Python 2023年9月6日
    039
  • Django初识下

    Http协议是超文本传输语言 get 获取服务端数据post 向服务端提交数据put 向服务端上传数据delete 删除服务端的资源 状态码 状态码英文标示 意义200 OK 请求…

    Python 2023年8月5日
    032
  • 10个优秀的Python库,实用且有趣

    为什么这么多人选择学习python?首先,python是一门全场景编程语言,对于初学编程的人而言,选择一门全场景编程语言是非常不错的选择;其次,python语言简单易学,对初学者十…

    Python 2023年9月18日
    056
  • 【jQuery 案例】电梯导航 切换 网页区域【功能实现详解】

    🍍 前言: 日常生活中用手机 📱,电脑 🖥️浏览网页时,滑到了页面下端后想返回顶部 或 跳转到页面别的版块,用鼠标滚动很麻烦, 网页电梯导航就可以很方便的精准到达目标版块。 此篇文…

    Python 2023年11月8日
    043
  • AI医疗高精尖!基于AI的新药研发!⛵

    💡 作者:韩信子@ShowMeAI📘 机器学习实战系列:https://www.showmeai.tech/tutorials/41📘 深度学习实战系列:https://www.s…

    Python 2023年10月24日
    062
  • CSRF和token以及用django实现

    csrf CSRF(Cross-Site Request Forgery,跨站点伪造请求)是一种网络攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点…

    Python 2023年10月30日
    043
  • argparse.ArgumentParser() 用法解析

    声明 本文借阅了各网站大佬的经验,已将原文附 Reference 部分,再此表达最诚挚的谢意,如有侵权,本人立即删除! *argparse 模块 argparse 是一个 Pyth…

    Python 2023年10月9日
    072
  • tensor学习 1 -tensor格式

    1、tf.constant 创建一个常量 2、tf.range 创建一个序列 tf.rang(开始,结束,步长)开始 Original: https://blog.csdn.net…

    Python 2023年8月26日
    046
  • 软件设计模式白话文系列(六)代理模式

    1、描述 代理模式属于结构型模式中的一种,通过对代理对象的调用来达到对原对象的增强、减弱作用。通过代理类的生成时机,我们将 编译期就生成代理类的情况称之为 静…

    Python 2023年10月15日
    032
  • Django(2):通过博客项目熟悉django项目开发基本流程

    目录 1.项目概述 2.项目初始化 * 2.1 创建项目 2.2 创建注册业务模块 2.3 创建管理用户 3.数据模型 * 3.1 模型定义 3.2 数据库同步 4.后台管理配置 …

    Python 2023年8月5日
    040
  • Django channel 使用说明 — 以聊天室为例(2)

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

    Python 2023年8月6日
    046
  • 【Kali】Kali在线安装详细教程【全】

    一、前期准备 kali镜像下载地址:http://mirrors.ustc.edu.cn/kali-images/ ; 二、VMware虚拟机配置 1、打开vmware,点击创建新…

    Python 2023年9月26日
    058
  • Unity-粒子特效

    粒子特效 创建粒子系统 * 模块 创建粒子系统 方法一:创建一个空物体(游戏物体),给物体加上Particle System组件。方法二:在Hierarchy视图右击 选择 Eff…

    Python 2023年9月29日
    060
  • 阿里云nginx uwsgi docker django 部署

    我是把nginx uwsgi django 部署在一个容器里,然后mysql部署在另外一个容器里,docker和mysql通讯没问题,主要问题出在nginx和uwsgi的配置,下面…

    Python 2023年8月4日
    073
  • Numpy教程:Numpy.random模块使用(新)

    目录 前言 创建 使用 * 1、创建指定维度数组 2、创建随机一维整数 3、随机选择 4、随机排列 分布 前言 本文介绍版本:Numpy1.22 在numpy1.17开始,Gene…

    Python 2023年8月24日
    055
  • python dataframe 替换_python – 在pandas dataframe列中有条件地替换值

    假设我有一个prandas数据帧,其列值为年龄,如df.age = {25,35,76,21,23,30} 我想做一个像这样的inplace替换: 如果df.age> = 2…

    Python 2023年8月22日
    036
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球