来源:早起Python
作者:读者投稿
最近几年,比特币一直站在风口浪尖,一度被追捧为最佳的投资产品,拥护者认为这种加密货币是一种类似于黄金的储值工具,可以对冲通胀和美元疲软。其他人则认为,比特币的暴涨只是一个经济刺激措施催生的巨大泡沫,并且必将破裂。
比特币数据很多网站都有,并且也有很多成熟的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数据文件
首先导入需要的包及相关设定
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=180
ax.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美元/枚,当然可以看到跌起来也是非常恐怖的,关于比特币,你怎么看?
数据分析咨询请扫描二维码
数据挖掘是现代企业利用数据驱动决策的重要工具。它涉及从大量数据中提取隐藏的、先前未知但潜在有用的信息,依托人工智能、机器 ...
2024-10-23在当前数据驱动的商业环境中,数据分析师的角色变得越来越重要。想要踏入这一领域并取得成功,不仅需要扎实的技术基础,还需要不 ...
2024-10-23数据分析是一个广泛而又精细的领域,它结合了统计学、计算机科学、商业策略以及数据科学等多个学科的知识。这个领域日新月异的发 ...
2024-10-23在现代企业中,数字化管理师扮演着至关重要的角色。他们不仅帮助企业优化资源配置,还推动企业的数字化转型。要成为一名合格的数 ...
2024-10-23大数据专业是一个跨学科的领域,涵盖了数学、统计学、计算机科学与技术等多个学科。随着数据在各个行业中的重要性日益增加,大数 ...
2024-10-23大数据分析师培训教程-2.1 Hadoop入门-Hadoop 1.0 的局限与 Hadoop 2.0(YARN)的革新 Hadoop简介Hadoop 的生态系统HDFS 的原理 ...
2024-10-232024,您是否渴望在数据领域探索更广阔的职业机遇? 数字化时代,数据量级每年都在呈指数级增长。据统计,全球互联网用户每天产 ...
2024-10-21数据科学专业是一门跨学科的综合性学科,涵盖了数学、统计学、计算机科学等多个领域。其核心目标是通过数据的收集、处理和分析来 ...
2024-10-21Python是一种高级解释性编程语言,由Guido van Rossum于1991年创造。凭借其简单易学、代码可读性强和功能强大的特点,Python已经 ...
2024-10-21在当今数据驱动的世界中,选择学习Hadoop已成为许多数据分析师和IT专业人士的必修课。Hadoop不仅是大数据处理领域的核心技术之一 ...
2024-10-21数据开发工程师在当今数据驱动的世界中扮演着至关重要的角色。他们不仅负责数据的采集和处理,还在数据仓库建设、系统开发和数据 ...
2024-10-20在当今快速变化的数字经济时代,数字化转型已经成为企业实现持续增长和竞争优势的关键。数字化转型不仅仅是技术的变革,更是组织 ...
2024-10-19在当今快速发展的科技时代,数字经济已成为全球经济的重要组成部分。选择数字经济专业,不仅能为你打开通往多个行业的大门,还能 ...
2024-10-18学习统计学与大数据分析具有显著的优势,能够帮助你走向高薪岗位。在数字化时代背景下,统计学和大数据分析展现出强大的就业潜力 ...
2024-10-18在当今的数字时代,数据科学与大数据技术专业的就业方向极为广泛,涵盖了多个领域和岗位。随着数据成为企业决策的重要依据,行业 ...
2024-10-18大数据技术与应用领域正在迅速发展,成为现代经济和科技发展的重要驱动力。随着数据量的爆炸式增长,各行各业对大数据专业人才的 ...
2024-10-18在当今数据驱动的商业环境中,数据分析软件已成为企业决策过程中不可或缺的工具。随着数据量的激增和分析需求的复杂化,选择合适 ...
2024-10-18在当今数据驱动的世界中,数据分析已成为许多行业不可或缺的一部分。无论是企业决策、市场营销,还是产品开发,数据分析都能提 ...
2024-10-18数据分析在现代企业中扮演着至关重要的角色,帮助企业在竞争激烈的市场中做出明智的决策。随着数据量的不断增长,企业需要依赖先 ...
2024-10-18CDA(Certified Data Analyst)认证在数据分析领域具有显著的作用,具体包括以下几个方面: 1. 专业技能认可 CDA认证是数据分析 ...
2024-10-17