作者 | 刘早起

来源 | 早起Python

头图 | 下载于视觉中国

最近几年,一直站在风口浪尖的比特币被追捧为最佳的投资产品,拥护者们认为这种加密货币是一种类似于黄金的储值工具,可以对冲通胀和美元疲软。其他人则认为,比特币的暴涨只是一个经济刺激措施催生的巨大泡沫,并且必将破裂。

本文就将对比特币2013年到2021年价格进行动态可视化,先看效果:

获取数据

比特币数据很多网站都有,并且也有很多成熟的API,所以取数据非常简单,直接调用API接口即可,下面是获取与写入数据的全部代码

import requests
import json
import csv
import time
time_stamp = int(time.time())
url = f"https://web-api.coinmarketcap.com/v1/cryptocurrency/ohlcv/historical?convert=USD&slug=bitcoin&time_end={time_stamp}&time_start=1367107200"
rd = requests.get(url = url)
# 返回的数据是 JSON 格式,使用 json 模块解析
co = json.loads(rd.content)
list1 = co['data']['quotes']with open('BTC.csv','w' ,encoding='utf8',newline='') as f:csvi = csv.writer(f)csv_head = ["date","price","volume"]csvi.writerow(csv_head)for i in list1:quote_date = i["time_open"][:10]quote_price = "{:.2f}".format(i["quote"]["USD"]["close"])quote_volume = "{:.2f}".format(i["quote"]["USD"]["volume"])csvi.writerow([quote_date, quote_price, quote_volume])

执行后,当前目录就会生成BTC.csv数据文件

动态可视化BTC价格变化

首先导入需要的包及相关设定

import pandas as pd
import matplotlib as mpl
from matplotlib import cm
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import matplotlib.animation as animation
from IPython.display import HTML
from datetime import datetime
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rc('axes',axisbelow=True)
mpl.rcParams['animation.embed_limit'] = 2**128

其中两句plt.rcParams[]是用来设置显示中文的plt.rc('axes',axisbelow=True)的作用是设置外观要求,即坐标轴置底。mpl.rcParams['animation.embed_limit'] = 2**128这句是为了生成动画而用的,由于动画默认的最大体积为20971520.字节。如果需要调整生成的动画最大体积,需要更改这个参数。

接下来数据并利用查看前5行与后5行

从表格初窥可以得知,13年初的价格在100美元左右,而到如今21年价格已经飞涨到5万左右了。具体在哪段时间飞涨如此之快呢,我们通过动态面积可视化来探索。

可视化之前,需要对数据进行处理,由于我们原本的数据是这样的

是csv格式,且Date字段是字符串类型,而在Python中运用matplotlib画时间序列图都需要datetime时间戳格式才美观,所以我们运用了如下代码进行转换

df = pd.read_csv('BTC.csv')
df['date']=[datetime.strptime(d, '%Y/%m/%d').date() for d in df['date']]

下面制作静态面积图,使用单色填充的话,可用如下代码

Span=180
N_Span=0
df_temp=df.loc[N_Span*Span:(N_Span+1)*Span,:]
df_temp.head(5)
fig =plt.figure(figsize=(6,4), dpi=100)
plt.subplots_adjust(top=1,bottom=0,left=0,right=0.9,hspace=0,wspace=0)
plt.fill_between(df_temp.date.values, y1=df_temp.price.values, y2=0,alpha=0.75, facecolor='r', linewidth=1,edgecolor ='none',zorder=1)
plt.plot(df_temp.date, df_temp.price, color='k',zorder=2)
plt.scatter(df_temp.date.values[-1], df_temp.price.values[-1], color='white',s=150,edgecolor ='k',linewidth=2,zorder=3)
plt.text(df_temp.date.values[-1], df_temp.price.values[-1]*1.18,s=np.round(df_temp.price.values[-1],1),size=10,ha='center', va='top')
plt.ylim(0, df_temp.price.max()*1.68)
plt.xticks(ticks=df_temp.date.values[0:Span+1:30],labels=df_temp.date.values[0:Span+1:30],rotation=0)
plt.margins(x=0.01)
ax = plt.gca()#获取边框
ax.spines['top'].set_color('none')    # 设置上‘脊梁’为无色
ax.spines['right'].set_color('none')  # 设置上‘脊梁’为无色
ax.spines['left'].set_color('none')   # 设置上‘脊梁’为无色
plt.grid(axis="y",c=(217/256,217/256,217/256),linewidth=1)         #设置网格线
plt.show()

其中Span设定的是多少天的价格,这里我们使用200天。N_Span代表权重;

df_temp=df.loc[N_Span*Span:(N_Span+1)*Span,:]代表的是选择到179行为止的数据,即180天。

plt.fill_between()是使用单色--红色填充,得到如下效果:

但是一个颜色填充总感觉不够好看,所以下面使用渐变色填充,使用plt.bar()函数实现Spectral_r颜色映射。代码如下:

Span_Date =180
Num_Date =360  #终止日期
df_temp=df.loc[Num_Date-Span_Date: Num_Date,:]  #选择从Num_Date-Span_Date开始到Num_Date的180天的数据
colors = cm.Spectral_r(df_temp.price / float(max(df_temp.price)))
fig =plt.figure(figsize=(6,4), dpi=100)
plt.subplots_adjust(top=1,bottom=0,left=0,right=0.9,hspace=0,wspace=0)
plt.bar(df_temp.date.values,df_temp.price.values,color=colors,width=1,align="center",zorder=1)
plt.plot(df_temp.date, df_temp.price, color='k',zorder=2)
plt.scatter(df_temp.date.values[-1], df_temp.price.values[-1], color='white',s=150,edgecolor ='k',linewidth=2,zorder=3)
plt.text(df_temp.date.values[-1], df_temp.price.values[-1]*1.18,s=np.round(df_temp.price.values[-1],1),size=10,ha='center', va='top')
plt.ylim(0, df_temp.price.max()*1.68)
plt.xticks(ticks=df_temp.date.values[0: Span_Date +1:30],labels=df_temp.date.values[0: Span_Date +1:30],rotation=0)
plt.margins(x=0.01)
ax = plt.gca()#获取边框
ax.spines['top'].set_color('none')   # 设置上‘脊梁’为无色
ax.spines['right'].set_color('none')  # 设置上‘脊梁’为无色
ax.spines['left'].set_color('none')   # 设置上‘脊梁’为无色
plt.grid(axis="y",c=(217/256,217/256,217/256),linewidth=1)   #设置网格线
plt.show()

这里的数据筛选有稍许不同,其中Span_Date设置初始时间,这里设置为180即从起始日开始算的180天。

Num_Date设置的是终止时间。

df_temp=df.loc[Num_Date-Span_Date: Num_Date,:]则是用loc函数筛选从180天到终止日期的数据。

效果如下:

动态可视化

最后,我们来将这幅图动起来,先将刚刚的绘图部分封装

def draw_areachart(Num_Date):Span_Date=180ax.clear()if Num_Date<Span_Date:df_temp=df.loc[0:Num_Date,:]df_span=df.loc[0:Span_Date,:]colors = cm.Spectral_r(df_span.price.values / float(max(df_span.price.values)))plt.bar(df_temp.date.values,df_temp.price.values,color=colors,width=1.5,align="center",zorder=1)plt.plot(df_temp.date, df_temp.price, color='k',zorder=2)plt.scatter(df_temp.date.values[-1], df_temp.price.values[-1], color='white',s=150,edgecolor ='k',linewidth=2,zorder=3)plt.text(df_temp.date.values[-1], df_temp.price.values[-1]*1.18,s=np.round(df_temp.price.values[-1],1),
size=10,ha='center', va='top')plt.ylim(0, df_span.price.max()*1.68)plt.xlim(df_span.date.values[0], df_span.date.values[-1])plt.xticks(ticks=df_span.date.values[0:Span_Date+1:30],labels=df_span.date.values[0:Span_Date+1:30],rotation=0,fontsize=9)else:df_temp=df.loc[Num_Date-Span_Date:Num_Date,:]colors = cm.Spectral_r(df_temp.price / float(max(df_temp.price)))plt.bar(df_temp.date.values[:-2],df_temp.price.values[:-2],color=colors[:-2],width=1.5,align="center",zorder=1)plt.plot(df_temp.date[:-2], df_temp.price[:-2], color='k',zorder=2)plt.scatter(df_temp.date.values[-4], df_temp.price.values[-4], color='white',s=150,edgecolor ='k',linewidth=2,zorder=3)plt.text(df_temp.date.values[-1], df_temp.price.values[-1]*1.18,s=np.round(df_temp.price.values[-1],1),
size=10,ha='center', va='top')plt.ylim(0, df_temp.price.max()*1.68)plt.xlim(df_temp.date.values[0], df_temp.date.values[-1])plt.xticks(ticks=df_temp.date.values[0:Span_Date+1:30],labels=df_temp.date.values[0:Span_Date+1:30],rotation=0,fontsize=9)    plt.margins(x=0.2)ax.spines['top'].set_color('none')  # 设置上‘脊梁’为红色ax.spines['right'].set_color('none')  # 设置上‘脊梁’为无色ax.spines['left'].set_color('none')  # 设置上‘脊梁’为无色plt.grid(axis="y",c=(217/256,217/256,217/256),linewidth=1)         #设置网格线  plt.text(0.01, 0.95,"BTC平均价格($)",transform=ax.transAxes, size=10, weight='light', ha='left')ax.text(-0.07, 1.03, '2013年到2021年的比特币BTC价格变化情况',transform=ax.transAxes, size=17, weight='light', ha='left')fig, ax = plt.subplots(figsize=(6,4), dpi=100)
plt.subplots_adjust(top=1,bottom=0.1,left=0.1,right=0.9,hspace=0,wspace=0)
draw_areachart(150)

之后使用matplotlib包的animation.FuncAnimation()函数,之后调用上述编写的draw_areachart(Num_Date)函数。

其中输入的参数Num_Date是如静态可视化中提及的日期作用一样,赋值为np.arange(0,df.shape[0],1)

最后使用Ipython包的HTML()函数将动画转换成动画页面的形式演示。代码如下:

import matplotlib.animation as animation
from IPython.display import HTML
fig, ax = plt.subplots(figsize=(6,4), dpi=100)
plt.subplots_adjust(left=0.12, right=0.98, top=0.85, bottom=0.1,hspace=0,wspace=0)
animator = animation.FuncAnimation(fig, draw_areachart, frames=np.arange(0,df.shape[0],1),interval=100)
HTML(animator.to_jshtml()) 

函数FuncAnimation(fig,func,frames,init_func,interval,blit)是绘制动图函数。其参数如下:

  • fig 表示绘制动图的画布名称(figure);

  • func为自定义绘图函数,如draw_barchart()函数;

  • frames为动画长度,一次循环包含的帧数,在函数运行时,其值会传递给函数draw_barchart (year)的形参“year”;

  • init_func为自定义开始帧可省略;

  • interval表示更新频率,计量单位为ms;

  • blit表示选择更新所有点,还是仅更新产生变化的点,应选择为True,但mac电脑用户应选择False,否则无法显示。

最后效果就是这样????

可以看到在过去的一年中,由于机构的兴趣日益增加,比特币上涨超过了6倍,最高突破58000美元/枚,当然可以看到跌起来也是非常恐怖的,关于比特币你怎么看呢,欢迎评论区讨论~

点击这里 ???? 关注我们~~~

更多精彩推荐
☞关于深度学习编译器,这些知识你需要知道☞小小几张图,把深度学习讲透彻☞Python 搭建车道智能检测系统☞网易伏羲论文入选 CVPR:AI 感知表情能力或实现巨大突破!
点分享点收藏点点赞点在看

用 Python 动态可视化,看看比特币这几年相关推荐

  1. ​用 Python 动态可视化,看看比特币这几年

    来源:早起Python本文约3600字,建议阅读8分钟比特币一年翻6倍? 最近几年,一直站在风口浪尖的比特币被追捧为最佳的投资产品,拥护者们认为这种加密货币是一种类似于黄金的储值工具,可以对冲通胀和美 ...

  2. Python动态可视化Cufflinks

    文章目录 一.cufflinks介绍 1.1 简介 1.2 安装 1.3 cufflinks包介绍 1.4 使用方法 二.cufflinks使用 2.0 条形图 bar 2.1 histogram直方 ...

  3. 厉害了,用Python绘制动态可视化图表,并保存成gif格式

    作者 | 俊欣 来源 | 关于数据分析与可视化 最近有粉丝问道说"是不是可以将这些动态的可视化图表保存成gif图",小编立马就回复了说后面会写一篇相关的文章来介绍如何进行保存gif ...

  4. python可视化脉搏和血氧数据并通过阈值动态调整、动态可视化异常值

    python可视化脉搏和血氧数据并通过阈值动态调整.动态可视化异常值的情况 # 导入基础库和包: import sys import os import pandas as pd import num ...

  5. python数据可视化源码_Python数据分析:基于Plotly的动态可视化绘图 随书源码[101MB]...

    随着信息技术的发展和硬件设备成本的降低,当今的互联网存在海量的数据,要想快速从这些数据中获取更多有效的信息,数据可视化是重要的一环.对于Python语言来说,比较传统的数据可视化模块是Matplotl ...

  6. python post 远程主机强迫关闭了一个现有的连接_Python最强动态可视化库!

    后台回复1024,解锁无限快乐! bar_chart_race 一个库「Bar Chart Race」,堪称Python界最强的动态可视化包. GitHub地址:https://github.com/ ...

  7. python动态心形代码_Python实现酷炫的动态交互式数据可视化,附代码!

    (关注公众号AI新视野,发送'资料'二字,免费获取50G人工智能视频教程!) 本文介绍如何创建交互式图表和小组件,使用python做数据可视化.涉及的python库有:Plotly, Bokeh, n ...

  8. python动态图表变化_Python数据可视化 pyecharts实现各种统计图表过程详解

    Python数据可视化 pyecharts实现各种统计图表过程详解 发布时间:2020-09-10 04:53:26 来源:脚本之家 阅读:78 1.pyecharts介绍 Echarts是一款由百度 ...

  9. 用 python 做一个动态可视化交互大屏

    你可能经常会在公司前台.展会.路演时看到可视化数据的交互大屏.今天我们就来用 python 做一个动态可视化的交互大屏图. 一.项目背景 随着科技的飞速发展,数据呈现爆发式的增长,任何人都摆脱不了与数 ...

最新文章

  1. kafka-0.10.2.1:Producer生产时无法自动创建Topic
  2. boost::geometry::centroid用法的测试程序
  3. Image.Save()发生“GDI+ 中发生一般性错误”
  4. AlphaGo技术剖析:揭开围棋大脑的神秘面纱
  5. PowerShell 2.0 实践(四)管理Windows进程
  6. .NET Core开发实战(第23课:静态文件中间件:前后端分离开发合并部署骚操作)--学习笔记(下)...
  7. 汇编语言(二十二)之统计减去奇数的个数
  8. 分布式计算框架Hadoop
  9. 7-53 字符串逆序 (10 分)
  10. PHP和MySQL Web开发从新手到高手,第1天-搭建PHP开发环境
  11. 图像融合论文及代码网址整理总结(2)——红外与可见光图像融合
  12. 全站最全NLP中英文停用词表(包含标点符号,可直接复制)
  13. 远程RPC调用用于js逆向
  14. 整理 kanban 的 DoR 和 DoD
  15. 数据量再大也不怕!笔记本电脑也可以分析 100GB 数据
  16. EVE 设备开机时的更改连线
  17. 100条信号完整性效应的经验法则
  18. log_device_placement参数
  19. java继承a mya new c,【转】Android应用程序完全退出
  20. gitlab ci ERROR: Uploading artifacts to coordinator... too large archive

热门文章

  1. 50个云终端只需一台服务器是怎么一回事
  2. Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  3. fastlane自动打包--详细介绍
  4. 用 Handler 轻松实现专属Android定时器
  5. Oracle Golden Gate体系架构详解(原创) - CzmMiao的博客生活 - ITeye技术网站
  6. ArcGIS制图之Sub Points点抽稀
  7. linux chattr命令
  8. 来玩Play框架07 静态文件
  9. AS1.0(2.0)中的XML示例
  10. 定制简单的Linux系统