開発を行う上でデータの取得はある意味登竜門だと思っています。「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形式は[ ]で囲まれている部分を一括りで考えています。これをリスト型と言います。
{ }の形式
そして、もう一つ覚えていただきたい方として{ }があります。{ }は{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を人間でもわかる日時に変換してみましょう。
タイムスタンプ=1661299200
↓
日時(Tokyo)=2022/08/24 09:00:00
と変換されると思います。
逆に変換することもできるのでいろいろ試してみてください。
※注意:本bot開発は「文系でもわかる!BitcoinのBOT自動売買トレードの始め方」をもとに開発・自分なりの解釈用備忘録としています。