python 画图 线标注_最简洁的Python时间序列可视化实现

7d04334c9a696f0c331392f50182e1c3.png

TUSHARE  金融与技术学习兴趣小组 

翻译整理、编辑 | 一只小绿怪兽

译者简介:北京第二外国语学院国际商务专业研一在读,目前在学习Python编程和量化投资相关知识。

作者:DataCamp

时间序列数据在数据科学领域无处不在,在量化金融领域也十分常见,可以用于分析价格趋势,预测价格,探索价格行为等。

学会对时间序列数据进行可视化,能够帮助我们更加直观地探索时间序列数据,寻找其潜在的规律。

本文会利用Python中的matplotlib【1】库,并配合实例进行讲解。matplotlib库是⼀个⽤于创建出版质量图表的桌⾯绘图包(2D绘图库),是Python中最基本的可视化工具。

【工具】Python 3

【数据】Tushare

【注】示例注重的是方法的讲解,请大家灵活掌握。

01

单个时间序列

首先,我们从tushare.pro获取指数日线行情数据,并查看数据类型。

import tushare as ts
import pandas as pd


pd.set_option('expand_frame_repr', False)  # 显示所有列
ts.set_token('your token')
pro = ts.pro_api()

df = pro.index_daily(ts_code='399300.SZ')[['trade_date', 'close']]
df.sort_values('trade_date', inplace=True) 
df.reset_index(inplace=True, drop=True)

print(df.head())

  trade_date    close
0   20050104  982.794
1   20050105  992.564
2   20050106  983.174
3   20050107  983.958
4   20050110  993.879

print(df.dtypes)

trade_date     object
close         float64
dtype: object

交易时间列'trade_date' 不是时间类型,而且也不是索引,需要先进行转化。

df['trade_date'] = pd.to_datetime(df['trade_date'])
df.set_index('trade_date', inplace=True)

print(df.head())

              close
trade_date         
2005-01-04  982.794
2005-01-05  992.564
2005-01-06  983.174
2005-01-07  983.958
2005-01-10  993.879

接下来,就可以开始画图了,我们需要导入matplotlib.pyplot【2】,然后通过设置set_xlabel()set_xlabel()为x轴和y轴添加标签。

import matplotlib.pyplot as plt


ax = df.plot(color='')
ax.set_xlabel('trade_date')
ax.set_ylabel('399300.SZ close')
plt.show()

82f23fdf6cea97527ec6d288645750b7.png

matplotlib库中有很多内置图表样式可以选择,通过打印plt.style.available查看具体都有哪些选项,应用的时候直接调用plt.style.use('fivethirtyeight')即可。

print(plt.style.available)

['bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark-palette', 'seaborn-dark', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'seaborn', 'Solarize_Light2', 'tableau-colorblind10', '_classic_test']

plt.style.use('fivethirtyeight')
ax1 = df.plot()
ax1.set_title('FiveThirtyEight Style')
plt.show()

c49fff0bf2cf6028836ecf434ebd14d0.png

02

设置更多细节

上面画出的是一个很简单的折线图,其实可以在plot()里面通过设置不同参数的值,为图添加更多细节,使其更美观、清晰。

figsize(width, height)设置图的大小,linewidth设置线的宽度,fontsize设置字体大小。然后,调用set_title()方法设置标题。

ax = df.plot(color='blue', figsize=(8, 3), linewidth=2, fontsize=6)
ax.set_title('399300.SZ close from 2005-01-04 to 2019-07-04', fontsize=8)
plt.show()

7d0072c3a9be769c3c9b62df24e8d231.png

如果想要看某一个子时间段内的折线变化情况,可以直接截取该时间段再作图即可,如df['2018-01-01': '2019-01-01']

df_subset_1 = df['2018-01-01':'2019-01-01']
ax = df_subset_1.plot(color='blue', fontsize=10)
plt.show()

67506efc786bb2b47b2f52a1fda408db.png

如果想要突出图中的某一日期或者观察值,可以调用.axvline().axhline()方法添加垂直和水平参考线。

ax = df.plot(color='blue', fontsize=6)
ax.axvline('2019-01-01', color='red', linestyle='--')
ax.axhline(3000, color='green', linestyle='--')
plt.show()

630e8d2aa46097ed12248ec15e9e6c08.png

也可以调用axvspan()的方法为一段时间添加阴影标注,其中alpha参数设置的是阴影的透明度,0代表完全透明,1代表全色。

ax = df.plot(color='blue', fontsize=6)
ax.axvspan('2018-01-01', '2019-01-01', color='red', alpha=0.3)
ax.axhspan(2000, 3000, color='green', alpha=0.7)
plt.show()

b1124d4c843c516dde1d10e5cba34e22.png

03

移动平均时间序列

有时候,我们想要观察某个窗口期的移动平均值的变化趋势,可以通过调用窗口函数rolling来实现。下面实例中显示的是,以250天为窗口期的移动平均线close,以及与移动标准差的关系构建的上下两个通道线upper和lower。

ma = df.rolling(window=250).mean()
mstd = df.rolling(window=250).std()

ma['upper'] = ma['close'] + (mstd['close'] * 2)
ma['lower'] = ma['close'] - (mstd['close'] * 2)

ax = ma.plot(linewidth=0.8, fontsize=6)
ax.set_xlabel('trade_date', fontsize=8)
ax.set_ylabel('399300.SZ close from 2005-01-04 to 2019-07-04', fontsize=8)
ax.set_title('Rolling mean and variance of 399300.SZ cloe from 2005-01-04 to 2019-07-04', fontsize=10)
plt.show()

6472b8322ff9dfaa803fdf654774e771.png

04

多个时间序列

如果想要可视化多个时间序列数据,同样可以直接调用plot()方法。示例中我们从tushare.pro上面选取三只股票的日线行情数据进行分析。

# 获取数据
code_list = ['000001.SZ', '000002.SZ', '600000.SH']
data_list = []
for code in code_list:
    print(code)
    df = pro.daily(ts_code=code, start_date='20180101', end_date='20190101')[['trade_date', 'close']]
    df.sort_values('trade_date', inplace=True)
    df.rename(columns={'close': code}, inplace=True)
    df.set_index('trade_date', inplace=True)
    data_list.append(df)
df = pd.concat(data_list, axis=1)
print(df.head())

000001.SZ
000002.SZ
600000.SH
            000001.SZ  000002.SZ  600000.SH
trade_date                                 
20180102        13.70      32.56      12.72
20180103        13.33      32.33      12.66
20180104        13.25      33.12      12.66
20180105        13.30      34.76      12.69
20180108        12.96      35.99      12.68

# 画图
ax = df.plot(linewidth=2, fontsize=12)
ax.set_xlabel('trade_date')
ax.legend(fontsize=15)
plt.show()
6a8a2ac47f21b98d37c31c01e3fd909c.png

调用.plot.area()方法可以生成时间序列数据的面积图,显示累计的总数。

ax = df.plot.area(fontsize=12)
ax.set_xlabel('trade_date')
ax.legend(fontsize=15)
plt.show()

a8760ef54b4b862285fd35bd41d1df3b.png

如果想要在不同子图中单独显示每一个时间序列,可以通过设置参数subplots=True来实现。layout指定要使用的行列数,sharexsharey用于设置是否共享行和列,colormap='viridis' 为每条线设置不同的颜色。

df.plot(subplots=True,
          layout=(2, 2),
          sharex=False,
          sharey=False,
          colormap='viridis',
          fontsize=7,
          legend=False,
          linewidth=0.3)

plt.show()

76d738770cc5e606dd73d7d1ffecb99e.png

05

总结

本文主要介绍了如何利用Python中的matplotlib库对时间序列数据进行一些简单的可视化操作,包括可视化单个时间序列并设置图中的细节,可视化移动平均时间序列和多个时间序列。

相关的官方文档和参考资料已附下面,感兴趣的话可以自行查阅更多内容!

6fb9485bca7ae0939342f6d69a999402.png

END

更多内容请关注“挖地兔”公众号。

0eb46a40cf29314dcf46d4813ae30d05.png【参考链接】

https://matplotlib.org/【1】

https://matplotlib.org/api/_as_gen/matplotlib.pyplot.html#module-matplotlib.pyplot【2】

https://www.datacamp.com/courses/visualizing-time-series-data-in-python【Datacamp】【扩展阅读】

Pandas必备技能之“分组聚合操作”

Pandas必备技能之“花式拼接表格”

Pandas必备技能之“时间序列数据处理”

Python+SQL无敌组合,值得你Pick!

如何正确使用Pandas库提升项目的运行速度?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504744.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux伙伴系统接口,Linux伙伴系统(一)--伙伴系统的概述

伙伴系统的概述Linux内核内存管理的一项重要工作就是如何在频繁申请释放内存的情况下,避免碎片的产生。Linux采用伙伴系统解决外部碎片的问题,采用slab解决内部碎片的问题,在这里我们先讨论外部碎片问题。避免外部碎片的方法有两种&#xff1…

c# 创建委托 消息订阅_C#面向对象之委托和事件

委托1.定义:委托也叫代理,就是把事情交给别人来做。2.声明委托语法: delegate 返回类型 委托名称();委托使用步骤1.声明委托public delegate int CalculatorDelegate(int a,int b);2.根据委托类型创建方法3.创建委托对象并指定方法Calculator…

linux 集群 lvs,linux集群--LVS集群

拓扑图:1、LVS配置脚本:需要安装:ipvsadm-1.24-10.i386.rpmvi /etc/rc.d/init.d/lvsdr#!/bin/bashvip192.168.0.116web1192.168.0.104web2192.168.0.114./etc/rc.d/init.d/functionscase "$1" instart)echo "startlvs-dr&quo…

服务器连接工具mat_将个人笔记本改造成Linux简易服务器

实验过程1、开启Ubuntu系统的ssh服务开启之后其他电脑就可以通过ssh登录Ubuntu服务器,通过安装openssh-server就可以达到目的。(1)查看主机有没有ssh服务在Ubuntu系统桌面右击后点击“打开终端”,输入一下命令:ssh localhost若出现&#xff1…

c语言存储结构的实现,(C语言)栈的链式存储结构的实现

#includetypedef struct Stack_Linklist{int data;struct Stack_Linklist *next;}Node,*pNode;typedef struct Stack{pNode pTop;pNode pBottom;}Stack,*pStack;void Initstack();//初始化;int Isempty();//判断栈是否为空void Push();//压栈int Pop();//出栈int Ge…

以下对c语言函数的描述中正确的是,以下对C语言函数的有关描述中,正确的是

摘要:它决习定于的学后天,下语密切关系的能与社力是会文化有。关描透性的是起渗利尿可引。认的r默链接路径是(,述中在建点时立站。...它决习定于的学后天,下语密切关系的能与社力是会文化有。函数人感型的偏好感受觉很丰富。关描透…

创建前缀一样的文件_SpringBoot:配置文件属性读取

SpringBoot中默认加载的是application.properties或者application.yaml文件,当然也支持自定义的属性文件。我们可以在此文件中写一些自己想要的配置信息,然后在用的地方读取。默认属性文件在application.properties文件中添加配置信息,如下&a…

c语言降序多项式加法,数据结构算法(多项式加法)的C语言完美实现

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼/*数据结构多项式加法用C语言的完美实现,书43页 算法 2.23[ 数据结构(C语言版) 严尉敏主编]*//*注释就不加了,本程序的所有函数书上都有说明*//*本程序Tourboc 2.0编译通过*/#include #include #include #in…

c语言 算术平均滤波法_单片机数字滤波的算法

单片机主要作用是控制外围的器件,并实现一定的通信和数据处理。但在某些特定场合,不可避免地要用到数学运算,尽管单片机并不擅长实现算法和进行复杂的运算。下面主要是介绍如何用单片机实现数字滤波。在单片机进行数据采集时,会遇…

非顺序控制结构的c语言语法是怎样的,流程控制语句:顺序结构和选择结构

流程控制语句概述:控制程序的执行流程分类:顺序结构选择结构循环结构顺序结构语句顺序结构语句:从上往下,依次执行选择结构if语句:switch语句:if语句:格式1:格式2:格式3:if语句的格式:if(比较表达式){语句体;}执行流程:先计算比较表达式的值,看其返回值是true还是fa…

python3 asyncio 爬虫_python3 asyncio异步新浪微博爬虫WeiboSpider

一些废话之前写的用python3urllib写的多线程微博(传送门),后面发现登录账号频繁被403,所以解决登录问题迫在眉睫。而且python的“多线程”并不那么多线程,最近因为刚需,需要稳定的微博爬虫,所以琢磨了一下使用selenium…

linux .forward,linux forward的实现

对于linux的数据包流向,大家应该是比较了解,如果还不是很了解,可以参考《OReilly.Understanding.Linux.Network.Internals.Dec.2005》,其中有一个图非常清楚的描述了数据包的流向。ip的数据包接收函数是ip_rcv()>ip_rcv_finish…

参数 携带 跳转_微信小程序:页面跳转及参数传递

本文首发自个人自有博客:【FaxMiao个人博客】,一个关注Web前端开发技术、关注用户体验、记录前端点滴,坚持更多原创,为大家提供高质量技术博文!前言小程序的跳转方法有很多种,有的人一直只用wx.navigateTo跳…

android+apk启动过程,Android Apk的运行过程(一)—— Activity启动与页面事件传递...

最近在看一本书--《Android 内核剖析》。看名字很唬人,内核剖析,看起来是讲很深入的东西,其实作者自己在前言里也说了对于Android内核深度的一些见解。此书其实只是一些抛砖引玉,对于更深度与更细节的东西并没有涉猎,但…

python在数字后添加字符_Python在字符前后补字符

def addForLR(voldStr, vaddStr, vlength, vleftTrue):"""数字前补0可以补"0"也可以补""# print(tools.addForLR(1123,0,6));# print(tools.addForLR(1123,0,6,False));param voldStr 旧字符串param vaddStr 添加字符串param vlength 字符长…

google 浏览器默认打开控制台_chrome浏览器使用 Console(控制台)

chrome浏览器使用 Console(控制台) 了解如何:打开DevTools Console(控制台),堆叠冗余消息或在自己的行上显示它们,清除或保持输出或将其保存到文件,过滤输出,以及了解其他Console(控制台)设置。 TL;DR 以专用面板形式,或作为任何其他面板的抽屉式面板的形式,打开Console…

android 外部内容分享到app内,外部跳转APP

需求广告推广、华为微服务;通过外部网页或者卡片跳转到我们的app指定界面。如果app已经存在打开app,app不存在跳转下载界面。APP配置android:name".LauncherActivity"android:launchMode"singleTask"android:screenOrientation"…

vue组件一直注册不了_Vue自定义组件及组件的注册方法

为了能在模板中使用,这些组件必须先注册以便 Vue 能够识别。这里有两种组件的注册类型:全局注册和局部注册。至此,我们的组件都只是通过Vue.component全局注册的:Vue.component(component-name, {// ... options ...})该组件名Vue…

android fragment 管理器,Android Fragment 與 Fragment管理器

Android Fragment 與 Fragment管理器首先談談Fragement的需求過去開發人員認為界面之間的跳轉只需要使用多個activity組成就行了;例如下圖中,在Activity-A管理的界面中單擊按鈕后,Activity-A響應事件並啟動Activity-B;而用戶在單擊…

如何把本地yum源给其他机器使用_如何使用系统安装盘做yum的本地源?

第一种方法:1。 在server1上copy所有光盘的内容到/server/rhel5/i386/,并对此目录做好了NFS共享,然后把Server下repodata改名为repodata。ins2。 # createrepo -g /misc/cd/Server/repodata。ins/comps-rhel5-server-core。xml -v /server/rh…