CryptowatchのAPIで取得したbitcoin価格のJSONデータから欲しい数字を取り出す前回の記事(「JSON形式のデータから自由に数字を取り出そう」)の、練習問題の答え合わせです。CryptowatchのAPIで、過去のbitFlyerのビットコイン価格(日足データ)をまとめて取得します。この手順については、すでに説明済み(こちらの記事)なので省略します。以下のAPIをそのまま使ってで説明を進めていきます。https://api.cryptowat.ch/markets/bitflyer/btcjpy/ohlc?periods=86400&after=1514764800このAPIでは2018年1月以降の日足データを取得しています。ここから、2018年1月16日、ビットコイン価格の大暴落があった日の終値と最安値を取得してみましょう。取得したJSONデータの構造を把握する取得したデータの最初の方の部分を切り取ってみると、以下のような構造になっていることがわかります。{"result":{"86400":[[1514764800,1519999,1713306,1502242,1675100,20188.11,32083065000],[1514851200,1673600,1684270,1568150,1635320,10534.478,17226760000],[1514937600,1637228,1760110,1600000,1725726,10670.864,17824102000],....最初の部分だけを見ると、{“result”:{“86400”:[[で始まっていますね。この先のデータがものすごく長いのですが、少なくともこの先頭の文字列を見るだけでも、以下のようなデータ構造になっていることはわかります。}}一番内側に[xx,xx,xx...]という数字が7個含まれた配列値のデータ群があり、これが1日分のデータです。このデータ群が日付分だけ存在します。]という大きな1つの配列値のデータ構造になっています。カッコで括られているため、”86400′′(日足)をキーとして、[]内のデータ全てを1つの値とするデータ構造になっていることがわかります。キーとする構造になっていることがわかります。ここで前回の記事で勉強したことを思い出せば、Pythonのプログラムで一番内側の価格データを指定するためには、data[“result”][“86400”][0][0]というように指定すればいいことがわかります。ところには、「左から何番目のデータか?」という数字が入ります。目的の日付データを探すさて、次に2018年1月16日(ビットコイン価格の大暴落があった日)のデータを探します。内側の数字データが、以下の順番で記載されていることはすでに説明しました。]実際に、JSONデータの先頭のUNIXタイムスタンプを、いくつか日時に直してみればわかりますが、Cryptowatchの価格データは毎日午前9時で区切られて日足データとしてまとめられていることがわかります。いうことは、2018年1月16日の暴落時の最安値が含まれた価格データを探すには、「2018年1月17日午前9時」までを区切りとするデータのまとまりを探せばいいことがわかります。これはUNIXタイムスタンプに変換すると、「1516147200」です。UNIXタイムスタンプ変換ツールJSONデータの配列値は、左から順番に0番目、1番目、2番目....、と数えることを思い出してください。今回の目的の価格データを探すためには、一番内側の[]のデータのまとまりのうち、先頭(0番目)が「1516147200」で始まっているデータの3番目の数字を取り出せばいいことがわかります。このデータをどうやって探すのか?さて、「自分で試してみてください」といっておいて申し訳ないのですが、実はここまで勉強した内容だけだと、ここで行き詰ってしまいます。この部分までたどり着けた方はいったん合格です(笑)ここから先に進むには、少し新しいプログラミングの知識が必要になります。]の何番目にあるのかが、わからないからです。形式になっていれば、キーを指定するだけで値を取り出すことができます。[[],[],[],[].....]のようなデータ構造の場合は、目的の数字が何番目の[]に入っているのか、自分で調べなければわかりません。for文を使ってループで探すこのような場合は、pythonのプログラミングで(先頭から順番に)片っ端から調べる、という方法を取ります。先頭の[]から順番に見ていき、一番内側の[]の先頭の数字が「1516147200」に一致するものを取り出す、というプログラムを組みます。JSONのデータ形式によっては、このような処理が必要になることも多いので、ソースコードを理解しておきましょう。エディタを起動して以下のようなプログラムを書いてみてください。1516147200:print(item[3])先頭から4行目までは前回の記事と全く同じです。新しく出てきたforのところから意味を説明します。文系の初学者の方が、できるだけ勉強をすっ飛ばして、実践からプログラミングを始める場合でも、どうしても絶対に「if文」と「for文」だけは理解していないと先に進めなくなります。for文/if文の概念自体が全くわからない方は、できれば以下の記事を先に読んで少しだけ勉強してみてください。15~30分くらいで大体、要領だけはつかめると思います。いうデータ構造になっており、知りたいのは何番目の[]に、2018年1月16日の価格データが含まれているか?です。[]の中の先頭(0番目)に日付の数字が含まれていて、3番目に最安値の価格が含まれていることはすでに知っています。一致する場合に、data[“result”][“86400”][???][3]の数字を取り出せばいいことになります。・というのを順番に自動的に試していけばいいわけです。いう変数名に置き換えて、for文のループ処理を実行しています。内側の[]の先頭の数字が「1516147200」に一致するかどうかは、if文で判定します。置き換えられる)が、「1516147200」に一致すればいいわけです。1516147200:という条件分岐を記述し、一致した場合にはその3番目の要素(item[3])を、print()で黒い画面に表示するように指示しています。実行してみるこれをAnacondaプロンプトで実行してみます。最安値は101万5000円でした。この日の最高値は168万1000円、前日の終値は171万7000円ですから、この1日で70万円近くも暴落したことになりますね。AMすごく良い取り組みだと思います。pgm書かなくなって久しいですが、ここを見つけて思わず書いてしまいました(笑)関数引数のリテラル記述など気になるところはありますが、とにかく素晴らしいと思いました。(いつの日か)利益がまとまったらお礼をしたいのでBTCアドレスかXRPアドレスなどを記載してください。更新を楽しみに拝読させて頂きます。方言が伝わらなかったみたいですね。リテラル表記です(昔話かもw)メインプロシージャ内に二か所あると思います。ポーリング間隔(秒指定)だと思います。リテラル表記だと仕様変更(或いは拡張)する際に呼出個所すべてを置換しないとおかしな挙動になると思います。そこで下記の様に呼出パラメータに変数を使用します。300とするだけで済みます。自由にノビノビと「リョータ」さんらしくやってください。PM>リテラル表記だと仕様変更(或いは拡張)する際に>呼出個所すべてを置換しないとおかしな挙動になると思います。いうことですね!たしかに60は最初に変数にしておくべきですね。コメントをキャンセルメールアドレスが公開されることはありません。