區塊鏈研究實驗室|使用Python和Pandas收集比特幣歷史資料

買賣虛擬貨幣

總體而言,近幾個月來,比特幣和加密貨幣一直在上漲。從三月份的突然崩盤以來,比特幣的反應非常好,此後價格幾乎翻了一番。再加上本月早些時候大肆宣傳的減半事件,現在有很多人好奇,希望開始投資比特幣。

好吧,在這裡,我展示了開始分析比特幣並將其轉換成可用形式的Python程式碼。我會使用pandas庫演示使用Python中有多麼容易的一件事。

如果您對加密貨幣不感興趣,那麼這可能也是一個很好的教程,演示Python和pandas在資料操作和分析方面的能力,並且可能有一些有用的程式碼片段可以應用於其他專案。

安裝pandas library

首先,如果還沒有pandas庫,就需要安裝它。只需在命令列中執行以下命令。

pipinstallpandas

或者您可以像我一樣使用Anaconda,則可以在使用的環境中開啟Anaconda終端,然後輸入以下命令。

condainstallpandas

如果沒有出現錯誤,則應正確安裝庫。我們馬上要做最後的測試。

對於資料分析,我發現Jupyter Notebook是最好的IDE,因為它允許您在塊中執行程式碼片段,因此在匯入和處理大型資料集時可以節省大量時間。但是任何IDE都可以。

所以現在進行一些編碼...

開啟一個新指令碼並儲存它。第一個任務是測試pandas庫是否安裝正確。

執行以下程式碼將庫匯入指令碼。如果沒有出現錯誤,則可以繼續本教程的其餘部分。

importpandasaspd

獲取資料集

我將使用的資料來自Kaggle,它是世界上最大的資料科學社羣,也是查詢大量資料集的最佳場所之一。該特定資料集是2012/01/01–2020/04/22比特幣的歷史分鐘資料。

將csv檔案下載並儲存到與指令碼相同的目錄後,現在將要載入該資料。為此,我們在pandas中使用pd.read_csv()方法,將資料檔名作為字串傳遞。這將建立一個包含csv檔案中所有資料的資料幀。

我們還將在資料框中執行.head()方法,該方法向我們顯示資料的前5行。如您所見,有一行資料,後面是四行連續的NaN值。這是因為缺少一些資料,因此我們需要做一些清理工作。這是由於多種原因造成的,但似乎在此資料集中的早期,並不是每分鐘都對資料進行存檔,因此丟失了大塊資料。

raw_data=pd.read_csv("bitstampUSD_1-min_data_2012-01-01_to_2020-04-22.csv")raw_data.head()

在資料幀上執行.tail()方法將顯示最後5行,您可以看到這些行實際上已滿。另外,請注意資料框索引列中該資料集中的行數(最左側) 超過四百萬!對於Excel來說太多了,但是Python和Pandas可以輕鬆地處理它。

raw_data.tail()

清理並格式化資料幀

所以現在我們要建立一個資料幀,其中刪除了所有的NaN值。在pandas中,這非常簡單,我們只在資料幀上使用.dropna()方法,並將其分配給我們稱為df的新資料幀。這是包含所有有用資料的資料框,這些資料將在以後的分析中使用。

我們還在資料幀上呼叫.reset_index()方法,以便重置索引列。這將為資料的第一行分配一個索引值,從0開始,為第二行分配一個索引值,依此類推。我們還將傳遞引數inplace = True。這在pandas中很常用,它的作用是告訴Python我們希望我們的原始資料框成為該資料框的新編輯版本。如果inplace未設定為True,則執行該行後,我們正在處理的資料幀將保持不變。使用.head()方法並檢視索引值來探索此行為。

我們還傳遞了第二個引數drop = True。預設情況下,.reset_index()方法將重置資料索引,但原始索引列將被複制到名為“ index”的新列中。我們沒有用這個額外的列,因此我們將其刪除。這也可以透過在資料幀上使用.drop()方法並指定要刪除的列名稱來實現。

df=raw_data.dropna()df.reset_index(inplace=True,drop=True)df.head()

更改時間戳格式

您可能看到'Timestamp'列的格式很奇怪,這實際上是UNIX時間格式,因此我們希望將其轉換為UTC時間。我們使用pd.to_datetime()方法執行此操作。我們將傳遞要對其執行此功能的資料的引數,即資料的“Timestamp”列,還將傳遞引數unit ='s',該引數告訴函式輸入的UNIX時間單位是秒。我們使用下面的程式碼行將此函式的輸出儲存到資料框中的“Timestamp”列。請注意,在pandas中引用列內的資料時,我們使用以下概念df ['Timestamp']。在方括號內傳遞的字串是列的名稱。

df['Timestamp']=pd.to_datetime(df['Timestamp'],unit='s')df.head()

我們可以在此處看到資料集的一部分實際上來自2011年。為完整起見,我將刪除這四行。當只有幾行要刪除時,執行此操作的最簡單方法是簡單地指定列表中行的索引,並將其傳遞給.drop()方法。我們還必須再次傳遞引數inplace = True。然後像以前一樣最終修復索引。

df.drop([0,1,2,3],inplace=True)df.reset_index(inplace=True,drop=True)df.head()

繪製資料以進行視覺檢查

因此現在我們的資料結構良好,希望所有資料都在資料框中。一個非常快速的檢查,以確保此時一切看上去都不錯,只是簡單地繪製一段時間內比特幣的價格。我們將透過在資料框上執行.plot()方法,然後指定要在x和y軸外的列。pandas中的.plot()方法實際上在後臺使用matplotlib庫顯示圖形,並嘗試為軸選擇合理的預設設定。當然您可以根據需要自定義圖表。

df.plot(x="Timestamp",y="Weighted_Price")

建立新列

太好了!因此,我們的資料看起來是正確的,因此我們可以繼續進行更有趣的部分,即分析或運算元據。您可能想做的一件事是建立一個新列,以某種方式處理資料。一個示例是找到每個連續時間點之間的差異。

我們可以使用pandas中內建的一個名為.diff()的方法來實現這一點。我們只需使用以下符號df[“Title of new column”]指定要建立的列,並將其設定為我們希望透過.diff()方法找到差異的列。

df["closeDiff"]=df["Close"].diff()df.head()

請注意,我們建立的新列名為“ closeDiff”。

現在讓我們想象一下,我們想為資料中的每一年建立資料框架。例如一個資料框df19包含了2019年以來的所有資料。一種方法是首先建立一個名為“ year”的列,其中包含每個資料點的year值。然後我們將建立一個新的資料框,其中僅包含“年”列等於2019的資料行。

為此,我們將首先建立一個“year”列。我們將“Timestamp”列輸入pd.DatetimeIndex類,並要求.year屬性。這將返回我們每個Timestamp的年份值,並將此資料分配給一個新列,我們將其定義為“year”。

df["year"]=pd.DatetimeIndex(df["Timestamp"]).yeardf.head()

因此現在我們需要一個新的資料框df19,其中包含資料框df中的所有行,在“year”列中的值為2019。為此,我們編寫以下程式碼行。這種表示法可能會造成一些混淆,但是在這裡我們只是說,用資料框df獲得所有行,其中“year”列等於2019,然後將其分配給名為df19的新資料框。

df19=df[df["year"]==2019]df19.reset_index(inplace=True,drop=True)df19.head()

現在我們可以像繪製資料之前一樣繪製圖表,但是這次僅繪製2019年的資料。

df19.plot(x="Timestamp",y="Weighted_Price")

儲存資料

現在您有了乾淨的資料,也許您已經新增到資料中或成為了子集。通常要儲存此資料,這樣就不必再次執行此程式碼。在資料幀上使用.to_csv()方法非常容易。以下是我用於儲存df19資料幀的程式碼,以便將來將來方便使用。傳遞給該方法的第一個引數是您希望將其另存為的檔名,而index = False告訴Python不要將資料幀的索引儲存到csv檔案中通常不需要的列中。

df19.to_csv('btc19.csv',index=False)

有了它,它是一個基礎框架,可讓您開始使用此比特幣歷史資料集,以及可以在Python和pandas中完成的一些基本操作。沒有.head()和.tail()呼叫的完整精簡程式碼可以在下面找到。

importpandasaspdraw_data=pd.read_csv("bitstampUSD_1-min_data_2012-01-01_to_2020-04-22.csv")df=raw_data.dropna()df.reset_index(inplace=True,drop=True)df['Timestamp']=pd.to_datetime(df['Timestamp'],unit='s')df.drop([0,1,2,3],inplace=True)df.reset_index(inplace=True,drop=True)df.plot(x="Timestamp",y="Weighted_Price")df["closeDiff"]=df["Close"].diff()df["year"]=pd.DatetimeIndex(df["Timestamp"]).yeardf19=df[df["year"]==2019]df19.reset_index(inplace=True,drop=True)df19.plot(x="Timestamp",y="Weighted_Price")df19.to_csv('btc19.csv',index=False)

---------------------------------------------

原文作者:Stephen Worsley

譯者:鏈三豐

譯文出處:http://bitoken.world

---------------------------------------------

描下放二維碼新增我,拉您進入技術交流群

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;