bot開発2.JSON形式のデータから欲しい情報を取得しよう

開発を行う上でデータの取得はある意味登竜門だと思っています。「CSV・TSV形式から取得する」「WEBページ(URL)から取得する」「データベースから取得する」などたくさんあります。その中でも今回はJSON形式に焦点を合わせます。

bitFlyerのAPIを叩いてJSON形式のデータを取得する方法を紹介しました。(国内取引所BitflyerのパブリックAPIを使ってみよう
pythonで取得した結果は以下の通りです。

どうですか?非常に読みにくく、どんな情報なのかわかりにくいというより、わからないですよね?(これをみて把握できる人いたら天才だと思います。)

このJSON形式から必要な情報を取得することで、みなさんがやりたいと思っていることも実現できるようになるので、一緒に取得してみましょう。

JSON形式のデータを見てみる

そもそもJSON形式ってどんな形のデータなの?と思っている方も多いはずです。少なくとも私は思っています。

以前にも書かせていただきましたが、JSON形式のデータは多く利用されており、bot開発以外でも目にする機会は十分あります。私も通常業務で毎日のようにJSON形式のデータを見ています。

例えば、以下のデータがあるとしましょう。

{
    "result":
        {
        "86400":[
                [1661299200,2945000,2970000,2870201,2943127,2145.48609668,6289313087.4170615],
                [1661385600,2943835,2998000,2896440,2931406,1692.62733232,4974722531.05773662],
                [1661472000,2931406,2978566,2920001,2947045,1359.28649271,4016868156.967419],
                [1661558400,2947464,2990000,2770000,2787000,3098.7884203,8974446747.73785588],
                [1661644800,2785901,2807167,2727000,2755111,1542.86300869,4274970054.24189577]
                ]
        },
    "allowance":
        {
        "cost":0.015,
        "remaining":9.94,
        "upgrade":"For unlimited API access, create an account at https://cryptowat.ch"
        }
}

[ ]の形式
JSON形式は[ ]で囲まれている部分を一括りで考えています。これをリスト型と言います。

[1514764800,1523200,1710000,1503164,1675530,601.07623,948861440]が一つとして考えます。プログラムでは不思議なことに[]の中身の順番を左から0番、1番、2番と考えていきます。上記の例で考えると1514764800が0番目、1523200が1番目となります。抽出する際に番号を指定するの場合は1514764800は[0]、1523200[1]となります。

{ }の形式
そして、もう一つ覚えていただきたい方として{ }があります。{ }は{AAA:▲▲▲,BBB:●●●,CCC:■■■}という形になります。これをdict型と言います。

この形にはkeyとvalueという概念があります。AAAをkeyとし、そのkeyに対しての値が▲▲▲ということになります。データの抽出例は以下の通りです。

dict = {"JP":"Japan", "DE":"Germany", "FR":"France"}
print(dict["DE"])

Germanyは抽出されます。

データを抽出してみよう

実際にデータを取り出してみましょう。取り出す対象は以下のURLのデータになります。

https://api.cryptowat.ch/markets/bitflyer/btcjpy/ohlc?periods=86400&after=1661299200

以下のデータが取得できます。

{
    "result":
        {
        "86400":[
                [1661299200,2945000,2970000,2870201,2943127,2145.48609668,6289313087.4170615],
                [1661385600,2943835,2998000,2896440,2931406,1692.62733232,4974722531.05773662],
                [1661472000,2931406,2978566,2920001,2947045,1359.28649271,4016868156.967419],
                [1661558400,2947464,2990000,2770000,2787000,3098.7884203,8974446747.73785588],
                [1661644800,2785901,2807167,2727000,2755111,1542.86300869,4274970054.24189577]
                ]
        },
    "allowance":
        {
        "cost":0.015,
        "remaining":9.94,
        "upgrade":"For unlimited API access, create an account at https://cryptowat.ch"
        }
}

ブラウザでみる本当に見にくいですね。じっくり見てみましょう。
まず、{}で括られている大外枠では”result”:{〜〜〜、”allowance”:{〜〜〜〜の二つがあります。”result”がkeyで{〜〜〜、がvalueです。その次、{“86400”:[〜〜〜が来ています。こちらもまた、{ }形式です。86400がkeyで、[〜〜〜がvalueとなります。、最後に[〜〜〜の中身です。[値1,値2,値3,値4・・・・]となっていることがわかります。

例えば、resultが86400のうち0番のリストの1番目の値が欲しい時、pythonでの記述は以下の通りです。

import requests
response = requests.get("https://api.cryptowat.ch/markets/bitflyer/btcjpy/ohlc?periods=86400&after=1514764800")
data = response.json()

print(data["result"]["86400"][0][1])

いかがでしょうか?抽出できましたか?

指定した時間のデータを取得してみよう

https://api.cryptowat.ch/markets/bitflyer/btcjpy/ohlc?periods=86400&after=1661299200のURLをブラウザで叩きデータを取得してきています。このURLをみて、いつのデータはすぐにわかりますか?わからないですよね?私もわかりません。

では、このデータはどの値を元にいつのデータなのかを判断しているのでしょうか?プログラムではタイムスタンプというものがあり、2022年8月22日というような形式で管理されているのではなくUNIXタイムスタンプというものが存在しており、その管理方法をとっていることがあります。

1661299200を人間でもわかる日時に変換してみましょう。

UNIXタイムスタンプ変換サイト

タイムスタンプ=1661299200

日時(Tokyo)=2022/08/24 09:00:00

と変換されると思います。

逆に変換することもできるのでいろいろ試してみてください。

※注意:本bot開発は「文系でもわかる!BitcoinのBOT自動売買トレードの始め方」をもとに開発・自分なりの解釈用備忘録としています。


Python勉強したいのであればこれ一択


AIの技術、データ分析を身につけるにはPythonが取り組みやすいです。専門コースもあるので、まずは、気軽に問い合わせしてみてください!
技術者も多くなってきていますが、世界と戦うにはまだまだ人材不足です。高い年収を狙うなら今がチャンス!


フリーランスエンジニアが登録して欲しいエージェント


長くお世話になっているengineer-route。
単価、稼働日数、稼働時間相談も親身にのってくれます。しっかりしたサポート・コミュニケーションを交わすことで「はいってみた違った」というエンジニアあるあるを極力回避できると思います。私は当たりしかないです。