前の記事のおさらいと本記事でやること
前の記事では初歩的なAPIの使い方を解説し、単一の仮想通貨の価格を取得するプログラムを作成しました。
この記事では、前の記事の方法にならって複数の仮想通貨を取得するコードを書いていきます。
複数のURLを取得する
URLを設定する
import requests
urls = ["https://public.bitbank.cc/btc_jpy/ticker",
"https://public.bitbank.cc/eth_btc/ticker",
"https://public.bitbank.cc/mona_jpy/ticker"]
今回は複数の仮想通貨の価格を取得したいので、複数のURLを リストにして 変数urlに代入します。
ループ文で順次通信を行い結果をリストとして保存する
リストの中の要素を一つ一つ処理するときはループ文(for文)で囲み、処理を書いていきます。
results = []
for url in urls:
r = requests.get(url, timeout=5)
r = r.json()
last = r['data']['last']
results.append(last)
まず6行目で、結果(仮想通貨の価格)を入れるための変数resultsをリストとして定義します。先の解説で複数のURLを直接リストとして代入したように、Pythonでは前もって変数の型を宣言する必要はありませんが、11行目でリストに要素を追加する関数appendを使用するために、前もってリストとして定義しています。
7行目でfor文を書くことにより変数urls中の各URLを変数urlとしてループさせ順次for文で囲んだ範囲の処理を行っていきます。
8行目~10行目は前の記事で解説したものと全く同じで、URL(API)にアクセス、jsonを辞書に変換、価格を参照・代入という作業をそれぞれ行っています。
11行目でlist.append()により、価格を変数resultsに順次代入しています。
>>> print(results)
['801982', '0.02030594', '99.301']
変数resultsの中身はそれぞれBTC/JPY、ETH/BTC、MONA/BTCの価格のリストになっていることが分かります。
結果のリストを操作して日本円価格に変換する
このままでも十分ですが、ETHの価格がBTC単位になっていてわかりづらいので、日本円価格に変換してみましょう。
>>> results[1] = int(results[0]) * float(results[1])
>>> print(results)
['798197', 16208.14039018, '99.250']
変数resultsの中身は一見整数や浮動小数点に見えますが、クォーテーションに囲まれているので、すべて文字列です。文字列のままでは計算が行えないため、resultsの1番目の要素(results[0]:BTC/JPY)をintにより整数、2番目の要素 (results[1]:ETH/BTC) をfloatにより浮動小数点に変換し、それぞれを掛け合わせることによりETH/JPYを算出します。
変数resultsの中身を見るとすべて日本円価格に変換されていることが分かります。なお、結果を見てわかるとおり、2番目の要素だけ文字列にはなっていません。この後に何か処理をする場合は注意するようにしましょう。
浮動小数点の計算は誤差が含まれることが知られています。
正確に計算を行うためにはDecimalモジュールを使用して、
from decimal import Decimal
eth = Decimal(btc) * Decimal(eth)
のようにすると良いでしょう。
結果の表示
>>> print("BTC価格は{}円です。".format(results[0]))
>>> print("ETH価格は{}円です。".format(results[1]))
>>> print("MONA価格は{}円です。".format(results[2]))
BTC価格は798187円です。
ETH価格は16257.80007267円です。
MONA価格は99.577円です。
得られたresultsをそれぞれ出力させることができました。
コードのまとめ
import requests
urls = ["https://public.bitbank.cc/btc_jpy/ticker",
"https://public.bitbank.cc/eth_btc/ticker",
"https://public.bitbank.cc/mona_jpy/ticker"]
results = []
for url in urls:
r = requests.get(url, timeout=5)
r = r.json()
last = r['data']['last']
results.append(last)
results[1] = int(results[0]) * float(results[1])
print("BTC価格は{}円です。".format(results[0]))
print("ETH価格は{}円です。".format(results[1]))
print("MONA価格は{}円です。".format(results[2]))
これで複数の仮想通貨の価格を取得・表示するプログラムが作成できました。
結果をリストで保存した場合には、何番目の価格に何の価格が入っているか・・・というのを開発者の脳内で常に想定しながらコードを書かなければいけません。また、コードを一見しただけではどこで何の処理をしているのかわかりづらくなる傾向があります。
代わりに結果を辞書として保存すると、よりスマートにコードを書ける場合もあります。
例えば今回のプログラムの結果を取得先の通貨ペアをキーとして辞書に保存すると、
import requests
urls = ["https://public.bitbank.cc/btc_jpy/ticker",
"https://public.bitbank.cc/eth_btc/ticker",
"https://public.bitbank.cc/mona_jpy/ticker"]
results = {}
for url in urls:
r = requests.get(url, timeout=5)
r = r.json()
last = r['data']['last']
url_key = url.replace("https://public.bitbank.cc/","").replace("/ticker","")
results[url_key] = last
results['eth_jpy'] = int(results['btc_jpy']) * float(results['eth_btc'])
for key, value in results.items():
print("{}の価格は{}円です。".format(key, value))
btc_jpyの価格は799355円です。
eth_btcの価格は0.02035840円です。
mona_jpyの価格は99.751円です。
eth_jpyの価格は16273.588832円です。
と書くこともできます。
※ 11行目で共通のURL部分をreplaceにより削除し、残った部分をキーとする
※13行目で新しくeth_jpyをキーとする要素を辞書に追加しているため結果が4行に増えている
今回程度のプログラムですとわざわざ辞書を作る必要もありませんが、複雑でわかりにくくなりそうな場合は辞書を使ってみることも検討してみましょう。