以前寫過一篇,主要是總(zhao)結(ban)了 kaggle 上入門 kernal 的代碼:
Kaggle 上的比特幣鏈上數據集 - 使用 Google Big Query API 處理比特幣數據(一)python
可是實際上這個數據集相關的 kernal 不算不少,不少想要作的東西沒缺少參考,須要本身探索。本次文章記錄了我探索 bigquery 數據的過程。數據庫
from google.cloud import bigquery client = bigquery.Client()
一段廢話:好久沒有寫過 SQL 了,第一次寫 SQL 是大一自學 PHP 後開發了一個用於統計咱們專業期末成績的網站。結果最終版的代碼在 Azure 欠費後還都丟掉了。後來上數據庫原理不喜歡那個老師,也沒好好學,再後來用 django 都是 orm 了,更寫 SQL。後來去中智實習,作 ETL 這是第一次實踐中用 SQL 才明白 SQL 有這麼強大的能力。可是如今也都忘了。
寫個最簡單,查詢 0 號區塊的全部信息。django
query = """ SELECT * FROM bigquery-public-data.crypto_bitcoin.blocks where number=0 """ r = client.query(query)
看一下 QueryJob 對象 r 有哪些方法和屬性:segmentfault
type(r), dir(r)
(google.cloud.bigquery.job.QueryJob,
[
'job_id',
'job_type',
'labels',
'location',
'path',
'query',
'query_parameters',
'referenced_tables',
'state',
'table_definitions',
'timeline',
'to_dataframe',
'total_bytes_billed',
'total_bytes_processed',
'user_email',
])
有不少,這裏就選了一些可能用的着的。
看一下它們的值(這代碼是在 kaggle notebook 裏輸入的,因此不用 print 也能返回結果。)數組
r.state, r.job_id, r.labels, r.location, r.path, r.query, r.referenced_tables, r.state, r.timeline, r.total_bytes_billed, r.total_bytes_processed, r.user_email
('DONE',
'ee67ed4d-80d4-4abf-bab4-522d33b52438',
{},
'US',
'/projects/kaggle-161607/jobs/ee67ed4d-80d4-4abf-bab4-522d33b52438',
'\nSELECT * FROM `bigquery-public-data.crypto_bitcoin.blocks` where number=0\n',
[TableReference(DatasetReference('bigquery-public-data', 'crypto_bitcoin'), 'blocks')],
'DONE',
[<google.cloud.bigquery.job.TimelineEntry at 0x7faad8e9e860>],
196083712,
196019375,
'data-proxy-public@kaggle-bq.iam.gserviceaccount.com')
這些都是一些狀態信息之類的,最重要的是數據:
r.to_dataframe 是函數,返回一個 pandas.core.frame.DataFrame
對象。函數
df = r.to_dataframe() df.head()
至此已經獲得比特幣原始數據了。網站
這裏大體分析一下咱們能夠在 bigquery 拿到哪些比特幣的數據。google
一共有 4 個表: blocks、inputs、outputs、transactionsspa
數量集應該是這樣:至今(2020 年 2 月 16 日)比特幣有 61 萬多區塊,交易數量估計是 6 億左右,而輸入輸出可能有 10 億。code
可是他這個數據並非最新的。因此沒有這麼多數據。
這裏面最關鍵的是 transactions 表。
一共 17 列
hash 交易哈希 String
size 交易大小(bytes) Numeric
virtual_size 好像隔離見證交易這個字段會與 size 不一樣 Numeric
version 協議版本 Numeric
lock_time 礦工能夠把交易歸入 Merkel 樹的最先時間 Numeric
block_hash 交易屬於的塊的哈希 String
block_number 交易屬於的區塊的編號 Numeric
block_timestamp 區塊時間戳 Date
block_timestamp_month 區塊時間的月 Date
input_count 輸入數量 Numeric
output_count 輸出數量 Numeric
input_value 輸入值總和 Numeric
output_value 輸出值總和 Numeric
is_coinbase 是不是鑄幣交易 Boolean
fee 交易手續費 Numeric
inputs 交易的輸入數組 數組
outputs 交易的輸出數組 數組
query = """ SELECT * FROM `bigquery-public-data.crypto_bitcoin.transactions` where block_number=500000 """ transactions_r = client.query(query) tx_df = transactions_r.to_dataframe() transactions_r.total_bytes_processed / (1024 ** 3)
這裏顯示: 1076.8477526148781 難道查詢一個區塊的交易就處理的 1 T 多的數據嗎?有點奇怪。
可使用
for i, row in tx_df.iterrows(): print(i, row['hash'], row['block_timestamp']) break
遍歷 dataframe 對象
歡迎來個人博客: https://codeplot.top/
個人博客比特幣分類:https://codeplot.top/tags/比特幣/