
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になるため、半年分くらいのデータが欲しかった私の利用用途には適合しませんでした。
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ベタ張りです)