<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?用 Python 動態(tài)可視化,看看比特幣這幾年

          共 7959字,需瀏覽 16分鐘

           ·

          2021-04-06 13:15


          來源:早起Python

          本文約3600字,建議閱讀8分鐘

          比特幣一年翻6倍?


          最近幾年,一直站在風(fēng)口浪尖的比特幣被追捧為最佳的投資產(chǎn)品,擁護者們認(rèn)為這種加密貨幣是一種類似于黃金的儲值工具,可以對沖通脹和美元疲軟。其他人則認(rèn)為,比特幣的暴漲只是一個經(jīng)濟刺激措施催生的巨大泡沫,并且必將破裂。

          本文就將對比特幣2013年到2021年價格進行動態(tài)可視化,先看效果:


          獲取數(shù)據(jù)

          比特幣數(shù)據(jù)很多網(wǎng)站都有,并且也有很多成熟的API,所以取數(shù)據(jù)非常簡單,直接調(diào)用API接口即可,下面是獲取與寫入數(shù)據(jù)的全部代碼:


          import requestsimport jsonimport csvimport timetime_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)# 返回的數(shù)據(jù)是 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])

          執(zhí)行后,當(dāng)前目錄就會生成BTC.csv數(shù)據(jù)文件



          動態(tài)可視化BTC價格變化

          首先導(dǎo)入需要的包及相關(guān)設(shè)定:


          import pandas as pdimport matplotlib as mplfrom matplotlib import cmimport numpy as npimport matplotlib.pyplot as pltimport matplotlib.ticker as ticker import matplotlib.animation as animationfrom IPython.display import HTMLfrom datetime import datetimeplt.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[]是用來設(shè)置顯示中文的plt.rc('axes',axisbelow=True)的作用是設(shè)置外觀要求,即坐標(biāo)軸置底。mpl.rcParams['animation.embed_limit'] = 2**128這句是為了生成動畫而用的,由于動畫默認(rèn)的最大體積為20971520.字節(jié)。如果需要調(diào)整生成的動畫最大體積,需要更改這個參數(shù)。

          接下來數(shù)據(jù)并利用查看前5行與后5行:


          從表格初窺可以得知,13年初的價格在100美元左右,而到如今21年價格已經(jīng)飛漲到5萬左右了。具體在哪段時間飛漲如此之快呢,我們通過動態(tài)面積可視化來探索。

          可視化之前,需要對數(shù)據(jù)進行處理,由于我們原本的數(shù)據(jù)是這樣的:



          是csv格式,且Date字段是字符串類型,而在Python中運用matplotlib畫時間序列圖都需要datetime時間戳格式才美觀,所以我們運用了如下代碼進行轉(zhuǎn)換:


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

          下面制作靜態(tài)面積圖,使用單色填充的話,可用如下代碼:


          Span=180N_Span=0df_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')    # 設(shè)置上‘脊梁’為無色ax.spines['right'].set_color('none')  # 設(shè)置上‘脊梁’為無色ax.spines['left'].set_color('none')   # 設(shè)置上‘脊梁’為無色plt.grid(axis="y",c=(217/256,217/256,217/256),linewidth=1)         #設(shè)置網(wǎng)格線   plt.show()

          其中Span設(shè)定的是多少天的價格,這里我們使用200天。N_Span代表權(quán)重;

          df_temp=df.loc[N_Span*Span:(N_Span+1)*Span,:] 代表的是選擇到179行為止的數(shù)據(jù),即180天。

          plt.fill_between()使用單色--紅色填充,得到如下效果:


          但是一個顏色填充總感覺不夠好看,所以下面使用漸變色填充,使用plt.bar()函數(shù)實現(xiàn)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天的數(shù)據(jù)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')   # 設(shè)置上‘脊梁’為無色ax.spines['right'].set_color('none')  # 設(shè)置上‘脊梁’為無色ax.spines['left'].set_color('none')   # 設(shè)置上‘脊梁’為無色plt.grid(axis="y",c=(217/256,217/256,217/256),linewidth=1)   #設(shè)置網(wǎng)格線   plt.show()

          這里的數(shù)據(jù)篩選有稍許不同,其中Span_Date設(shè)置初始時間,這里設(shè)置為180即從起始日開始算的180天。

          Num_Date設(shè)置的是終止時間。

          df_temp=df.loc[Num_Date-Span_Date: Num_Date,:] 則是用loc函數(shù)篩選從180天到終止日期的數(shù)據(jù)。

          效果如下:


          動態(tài)可視化


          最后,我們來將這幅圖動起來,先將剛剛的繪圖部分封裝:


          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') # 設(shè)置上‘脊梁’為紅色 ax.spines['right'].set_color('none') # 設(shè)置上‘脊梁’為無色 ax.spines['left'].set_color('none') # 設(shè)置上‘脊梁’為無色 plt.grid(axis="y",c=(217/256,217/256,217/256),linewidth=1) #設(shè)置網(wǎng)格線 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()函數(shù),之后調(diào)用上述編寫的draw_areachart(Num_Date)函數(shù)。

          其中輸入的參數(shù)Num_Date是如靜態(tài)可視化中提及的日期作用一樣,賦值為np.arange(0,df.shape[0],1)。

          最后使用Ipython包的HTML()函數(shù)將動畫轉(zhuǎn)換成動畫頁面的形式演示。代碼如下:


          import matplotlib.animation as animationfrom IPython.display import HTMLfig, 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())

          函數(shù)FuncAnimation(fig,func,frames,init_func,interval,blit)是繪制動圖函數(shù)。其參數(shù)如下:


          • fig 表示繪制動圖的畫布名稱(figure);

          • func為自定義繪圖函數(shù),如draw_barchart()函數(shù);

          • frames為動畫長度,一次循環(huán)包含的幀數(shù),在函數(shù)運行時,其值會傳遞給函數(shù)draw_barchart (year)的形參“year”;

          • init_func為自定義開始幀可省略;

          • interval表示更新頻率,計量單位為ms;

          • blit表示選擇更新所有點,還是僅更新產(chǎn)生變化的點,應(yīng)選擇為True,但mac電腦用戶應(yīng)選擇False,否則無法顯示。


          最后效果就是這樣??


          可以看到在過去的一年中,由于機構(gòu)的興趣日益增加,比特幣上漲超過了6倍,最高突破58000美元/枚,當(dāng)然可以看到跌起來也是非常恐怖的,關(guān)于比特幣你怎么看呢,歡迎評論區(qū)討論~

          編輯:黃繼彥

          校對:林亦霖

          瀏覽 34
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  青娱乐超碰在线 | 鸡巴在线观看 | 成人视频二区三区 | 青青草自拍偷拍在线视频 | 国产精品吴梦梦一区二区 |