在Python中搭建幣價(jià)樹形圖
本文轉(zhuǎn)載自微信公眾號(hào)「區(qū)塊鏈研究實(shí)驗(yàn)室」,作者鏈三豐 。轉(zhuǎn)載本文請(qǐng)聯(lián)系區(qū)塊鏈研究實(shí)驗(yàn)室公眾號(hào)。
截至2021年3月,有8,000多種加密貨幣,因此一目了然地跟蹤所有價(jià)格的發(fā)展可能是具有挑戰(zhàn)性的。幸運(yùn)的是,像coin360這樣的網(wǎng)站以樹形圖的形式提供了加密貨幣價(jià)格發(fā)展的簡(jiǎn)潔可視化。樹狀圖通過使用可變大小的矩形以嵌套結(jié)構(gòu)的形式顯示比例價(jià)格數(shù)據(jù),從而提供了所有加密貨幣的快速概覽。
對(duì)此概念感興趣,我決定嘗試使用Python創(chuàng)建我自己的版本的樹形圖以跟蹤加密價(jià)格的想法。此樹形圖教程不僅限于顯示加密信息,還可以應(yīng)用于幾乎任何其他數(shù)據(jù)。
為了最大程度地提高Python代碼的可移植性,本教程使用Google Colab創(chuàng)建,因此筆記本可以在任何Chrome瀏覽器上運(yùn)行。
本教程的3個(gè)主要組成部分是:
如何使用CoinMarketCap API調(diào)用和檢索最近24小時(shí)內(nèi)的加密貨幣價(jià)格
使用庫(kù)Squarify在Python中繪制靜態(tài)樹圖
使用庫(kù)Plotly在Python中繪制交互式樹圖
從CoinMarketCap檢索加密數(shù)據(jù)
免責(zé)聲明:CoinMarketCap數(shù)據(jù)的免費(fèi)版本僅供個(gè)人使用,出于商業(yè)目的,請(qǐng)參閱CMC的定價(jià)計(jì)劃。
首先,如果您還沒有的話,您需要在此處注冊(cè)一個(gè)開發(fā)者帳戶。登錄后,導(dǎo)航至儀表板并復(fù)制唯一的API密鑰。
CoinMarketCap截圖
通過使用下面顯示的代碼片段,您應(yīng)該能夠從CoinMarketCap調(diào)用前10個(gè)加密數(shù)據(jù)??梢哉{(diào)整參數(shù)以包括更多或更少的數(shù)據(jù)以及所使用的貨幣。切記在第15行中替換您的API密鑰。此代碼段在發(fā)布時(shí)是最新的,有關(guān)將來(lái)的任何更新,請(qǐng)參閱官方文檔。
- #This example uses Python 2.7 and the python-request library.
- from requests import Request, Session
- from requests.exceptions import ConnectionError, Timeout, TooManyRedirects
- import json
- url = 'https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest'
- parameters = {
- 'start':'1',
- 'limit':'10',
- 'convert':'USD'
- }
- headers = {
- 'Accepts': 'application/json',
- 'X-CMC_PRO_API_KEY': '#REPLACE YOUR API KEY HERE#',
- }
- session = Session()
- session.headers.update(headers)
- try:
- response = session.get(url, params=parameters)
- data = json.loads(response.text)
- print(data)
- except (ConnectionError, Timeout, TooManyRedirects) as e:
- print(e)
API返回的數(shù)據(jù)為JSON格式,因此需要以pythonic數(shù)據(jù)框格式進(jìn)行規(guī)范化(請(qǐng)參見第4行)。還對(duì)數(shù)據(jù)進(jìn)行過濾,以僅保留與樹圖相關(guān)的幾列,即加密貨幣的名稱,排名,價(jià)格及其關(guān)聯(lián)的市值(請(qǐng)參閱第5行)。
- import pandas as pd
- #normalize the data into dataframe format
- df = pd.json_normalize(data["data"])
- cols_to_keep = ['name','symbol','cmc_rank','quote.USD.price','quote.USD.percent_change_24h','quote.USD.market_cap',]
- df_final = df[cols_to_keep]
- #rename columns
- df_final.columns = ['name','symbol','cmc_rank','USD_price','USD_percent_change_24h','USD_market_cap',]
- #uncomment below to print the table
- #df_final
創(chuàng)建一個(gè)靜態(tài)樹圖
使用Squarify創(chuàng)建的樹圖
Squarify是樹圖布局算法的庫(kù)實(shí)現(xiàn)。它通過計(jì)算數(shù)據(jù)大小并返回矩形的一系列坐標(biāo)來(lái)工作,然后使用繪制這些坐標(biāo)MatPlotLib。可以使用顏色編碼的參數(shù)來(lái)可視化變化的規(guī)模,在此示例中,其是過去24小時(shí)內(nèi)價(jià)格變化的百分比。但是,不利的一面是,目前尚無(wú)直接實(shí)現(xiàn)可根據(jù)變化的矩形的大小來(lái)縮放標(biāo)簽的方法。Python代碼如下。
- import matplotlib
- import matplotlib.pyplot as plt
- #!pip install squarify
- import squarify
- #load data
- sizes=df_final["USD_market_cap"]
- label=df_final["name"]
- # color scale on the price development
- # min and max values
- cmap = matplotlib.cm.RdYlGn #RedYellowGreen
- mini=min(df_final["USD_percent_change_24h"])
- maxi=max(df_final["USD_percent_change_24h"])
- norm = matplotlib.colors.Normalize(vmin=mini, vmax=maxi)
- colors = [cmap(norm(value)) for value in df_final["USD_percent_change_24h"]]
- # labels in treemap squares
- labels = ["%s\n%d USD\n%0.2f%%" % (label) for label in zip(df_final.symbol, df_final["USD_price"], df_final["USD_percent_change_24h"])]
- # make plot
- fig = plt.figure(figsize=(20, 10))
- ax = fig.add_subplot(111, aspect="auto")
- ax = squarify.plot(df_final["USD_market_cap"], color=colors, label=labels, alpha=.8)
- ax.set_title("Cryptomarket price change last 24 hours\n", fontsize=18)
- # plot title and color bar
- img = plt.imshow([df_final["USD_percent_change_24h"]], cmap=cmap)
- img.set_visible(True)
- fig.colorbar(img, orientation="vertical", shrink=.96)
- fig.text(.76, .9, "Percentage change", fontsize=14)
- # if you want to export the figure
- #plt.savefig("cmc_treemaps.png")
- plt.show()
說明:
第1至4行:導(dǎo)入并安裝(如果需要)所需的庫(kù)
第6-8行:加載樹形圖的數(shù)據(jù)
第10-16行:對(duì)價(jià)格變化百分比應(yīng)用顏色編碼的縮放比例
第18-19行:為要顯示的文本創(chuàng)建字符串標(biāo)簽
第21–25行:繪制樹形圖
第27–31行:在側(cè)面應(yīng)用顏色條
第33–35行:顯示樹狀圖,并帶有將其導(dǎo)出為png圖像的選項(xiàng)
創(chuàng)建交互式樹形圖
掃碼查看交互式樹形圖效果
繪制樹圖的一種更復(fù)雜的方法是將其激活!使用Plotly可以創(chuàng)建一個(gè)交互式樹狀圖,當(dāng)您在每個(gè)矩形塊上懸停時(shí),它會(huì)顯示有關(guān)每個(gè)矩形塊的詳細(xì)信息。Plotly在后臺(tái)為您完成了大部分工作,從而導(dǎo)致與Squarify相比,更少的代碼行更加精簡(jiǎn)和優(yōu)雅。
- #!pip install --upgrade plotly
- import plotly.graph_objects as go
- import plotly.express as px
- fig = px.treemap(df_final,
- path=['name'],
- values='USD_market_cap',
- color_continuous_scale='RdYlGn',
- color='USD_percent_change_24h',
- )
- fig.update_layout(title_text='Cryptomarket price change last 24 hours', title_x=0.5)
- fig.show()
說明:
第1至3行:導(dǎo)入并安裝所需的庫(kù)
第5-10行:繪制樹形圖
第11行:在樹形圖上添加標(biāo)題
第12行:顯示樹狀圖
如何在媒體/網(wǎng)站中嵌入交互式樹圖
想知道您上面看到的嵌入式樹形圖是如何完成的?您可以使用Plotly Studio輕松地做到這一點(diǎn),而好處是您可以直接將Google Colab筆記本與Plotly Studio關(guān)聯(lián)(您需要有一個(gè)帳戶)。只需在下面添加此代碼段,然后使用您的Plotly用戶名和API密鑰即可完成。
- #To push your GC plot to Plotly Studio automatically
- #!pip install chart_studio
- import chart_studio
- import chart_studio.plotly as py
- username = '#REPLACE YOUR USERNAME HERE#' # your username
- api_key = '#REPLACE YOUR API KEY HERE#' # your api key - go to profile > settings > regenerate key
- chart_studio.tools.set_credentials_file(username=username, api_key=api_key)
- py.plot(fig, filename = 'cmc_treemap', auto_open=True)
將您的Plotly樹圖推入/同步到Plotly Studio后,只需將鏈接復(fù)制到Plotly Studio,然后將該鏈接粘貼到Medium中作為嵌入式鏈接,然后按Enter鍵,就可以了!
如何在網(wǎng)站上上插入嵌入式鏈接
總結(jié)
通過可視化不同矩形和顏色的層次結(jié)構(gòu)數(shù)據(jù),樹形圖是講述故事的好方法。當(dāng)您要按大小順序快速可視化大量數(shù)據(jù),以及可以選擇對(duì)第二維使用不同色調(diào)和顏色強(qiáng)度的選項(xiàng)時(shí),此功能非常有效。但是,樹形圖的一個(gè)缺點(diǎn)是進(jìn)行精確的定量比較可能具有挑戰(zhàn)性。