目的
read_jsonでwebリソースからDataFrameを作成するときに毎回通信を発生させない
背景
web apiを使って情報を取得して色々したいが、リクエスト数に制限があり、毎回アクセスしていては、すぐに上限に引っかかってしまう。
テストコードを書いているときはリアルタイムな情報は必要ないので、ローカルにキャッシュで持っておきたい。
ライブラリ
- pandas
- requests
- requests_cache
- StringIO
サンプルコード
import pandas as pd
import requests
import requests_cache
from io import StringIO
requests_cache.install_cache()
response = requests.get("https://financialmodelingprep.com/api/v3/income-statement/AAPL?apikey=demo")
content = response.content.decode()
df = pd.read_json(StringIO(content))
解説
requests_cache
request.get
で取得するときにキャッシュが存在する場合は通信を行わず、キャッシュからresponseを返す。
requests_cache.install_cache("test")
でキャッシュ名を変更し、それぞれ管理できる。
キャッシュはsqliteで行われる。ファイルを削除すれば、キャッシュの削除ができる。
StringIO
pd.read_json
に指定するのはファイル名、URLなので、requestsで取得したstr
はそのままだと指定できない。
StringIO(content)
とすることで、str
をファイルのように扱うことができる