見出し画像

Blockchain データ分析(1):分析用データの入手

本記事は 勉強用に金融トランザクション・データを入手する|New-Village (note.com) と同一内容になります。データ収集用のスクリプトを Python で作成しなおしたので、ファイルの一括入手 部分のみを書き直したものになります。

Spark を使った分析アプリケーション構築を作るに際して、ある程度の規模を持ったトランザクション・データが欲しかったので、暗号資産の取引データを入手してみました。
Googleで検索した感じ、日本語での説明書きがなかったので、記録として残しておきます。


1.データソースの選定

Blockchain から直接入手

暗号資産のデータはブロックチェーンから直接取得することが可能です。Github 上でETLプロジェクトが共有されており、Pythonであれば pip でプロジェクトを入手して、自分のアプリに組み込むことも可能です。

(結論)
ストリームでのデータ入手も可能で自由度は高いですが、ビットコイン・ノードのインストールが必要で環境構築が面倒だったので利用を断念しました。

https://github.com/blockchain-etl

Google BigQuery から入手

Google BigQuery から暗号資産のデータに対するクエリ実行と、CSVやJSON形式でのデータのダウンロードが可能です。Google アカウントがあれば無償で利用可能で、日本語で解説したQiitaの記事もあるため、かなりハードルは低いと思います。

(結論)
BigQueryは、最大1GBのデータ・ダウンロードが可能(※フォーマットによって異なる)ですが、ビットコインのデータは、1か月で最低でも数GBになるため、半年分くらいのデータが欲しかった私の利用用途には適合しませんでした。

https://cloud.google.com/blog/topics/public-datasets/bitcoin-in-bigquery-blockchain-analytics-on-public-data?hl=en

AWS Public Blockchain Data から入手

こちらのデータ・セットは、2009年からのビットコインと2015年からのイーサリアムのみが対象となっていますが、1日単位で Parquet 形式に分割されて S3 上に保存されています。ダウンロードするために、AWS CLIのインストールは必要でしたが、AWSアカウントでの認証は不要です。

(結論)
入手が容易で、入手後のファイル形式も Spark でハンドリングする上では問題にならないので、こちらの手法で進めることとしました。

https://registry.opendata.aws/aws-public-blockchain/

2.データの入手手順

AWS CLI のインストール

今回、私は WSL 上に環境構築しているため、AWS CLI install and update instructions を参考に、AWS CLI をインストールします。

$ sudo apt install unzip
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
rm awscliv2.zip
sudo ./aws/install

ファイルの確認

AWS CLI のインストールが完了したら、コマンドラインを利用して、ファイルを確認してみます。S3のディレクトリについては Github の guidance-for-digital-assets-on-aws にしました。
下記コマンドでは、ビットコインの2020年2月6日付のトランザクションデータを確認しています。1日で約456MBのParquetファイルが生成されています。
日付を変えれば、他の日のデータを確認することも可能です。

$ aws s3 ls --no-sign-request s3://aws-public-blockchain/v1.0/btc/transactions/date=2020-02-06/
2022-09-16 06:28:20  456230891 part-00000-4cbf63db-6734-4292-bbe2-6530ec2b92ca-c000.snappy.parquet
$ aws s3 ls --no-sign-request s3://aws-public-blockchain/v1.0/btc/transactions/date=2009-01-03/
2022-09-16 01:27:14       8807 part-00000-bdd84ab2-82e9-4a79-8212-7accd76815e8-c000.snappy.parquet

ファイルのダウンロード

上記 ls コマンド と同じ要領で cp コマンドを使うことで、ローカルにファイルをコピーすることができます。

$ aws s3 cp s3://aws-public-blockchain/v1.0/btc/transactions/date=2009-01-03/ ./ --recursive --no-sign-request 
download: s3://aws-public-blockchain/v1.0/btc/transactions/date=2009-01-03/part-00000-bdd84ab2-82e9-4a79-8212-7accd76815e8-c000.snappy.parquet to ./part-00000-bdd84ab2-82e9-4a79-8212-7accd76815e8-c000.snappy.parquet
$ ls
part-00000-bdd84ab2-82e9-4a79-8212-7accd76815e8-c000.snappy.parquet

3.ファイルの一括入手

最後にファイルの一括入手に向けて、Python + boto3(AWS SDK)で収集用のスクリプトを作成しました。

ファイル実行時に引数を YYYYMM の形式でつけると、対象月のデータを収集してきてくれます。下記は2009年1月を対象としていますが、いくつかの日はデータが存在していないため WORNING が発生しています。

$ python3 app.py 200901
[FAILURE] v1.0/btc/transactions/date=2009-01-01/ is not Found
[FAILURE] v1.0/btc/transactions/date=2009-01-02/ is not Found
[FAILURE] v1.0/btc/transactions/date=2009-01-04/ is not Found
[FAILURE] v1.0/btc/transactions/date=2009-01-05/ is not Found
[FAILURE] v1.0/btc/transactions/date=2009-01-06/ is not Found
[FAILURE] v1.0/btc/transactions/date=2009-01-07/ is not Found
[FAILURE] v1.0/btc/transactions/date=2009-01-08/ is not Found

なお、引数をつけずに実行すると前日日付の1日分を取得するようになっています。

コードについては下記で公開しているので、ご参照ください。
(なぜか 埋め込みリンクにすると表示されないので、URLベタ張りです)

https://github.com/new-village/python-training/tree/20af52410a491ed1d59071a5e93d823f7d8f7d31/btc-transaction

この記事が気に入ったらサポートをしてみませんか?