Botterのためのpandas入門(仮)

Botterのためのpandas入門(仮)

Warning

ToDo 免責事項をかく

データの取得

Jupyterカーネルはevent loopが作成されています。 asyncio.runloop.run_until_complete を実行すると、event loopがネスト構造となりますが、Pythonではネストしたevent loopが生成できません。

Jupyterからasyncioを実行

nest_asyncio はネストしたevent loopが実装でき、JupyterやGUIアプリケーションなどの実行環境で asyncio.runloop.run_until_complete を実行できます。

import asyncio

import nest_asyncio
import pandas as pd
import plotly.graph_objects as go
import pybotters
from IPython.display import HTML

nest_asyncio.apply()

APIからデータを取得

pandasの利用例として、ヒストリカルデータを扱います。 pybotters を利用して、FTXのAPIから4本値を取得します。

async def get_candles(market_name, resolution, start_time, end_time):
    async with pybotters.Client(
        apis={"ftx": ["", ""]}, base_url="https://ftx.com/api"
    ) as client:
        res = await client.get(
            f"/markets/{market_name}/candles",
            params={
                "resolution": resolution,
                "start_time": start_time,
                "end_time": end_time,
            },
        )
        return await res.json()


data = asyncio.run(get_candles("BTC-PERP", 300, 1643641200, 1643727600))
data["result"][:5]
[{'startTime': '2022-01-31T15:00:00+00:00',
  'time': 1643641200000.0,
  'open': 37534.0,
  'high': 37734.0,
  'low': 37534.0,
  'close': 37673.0,
  'volume': 38447865.9473},
 {'startTime': '2022-01-31T15:05:00+00:00',
  'time': 1643641500000.0,
  'open': 37673.0,
  'high': 37853.0,
  'low': 37615.0,
  'close': 37791.0,
  'volume': 30392886.7346},
 {'startTime': '2022-01-31T15:10:00+00:00',
  'time': 1643641800000.0,
  'open': 37791.0,
  'high': 37819.0,
  'low': 37720.0,
  'close': 37724.0,
  'volume': 23186162.9091},
 {'startTime': '2022-01-31T15:15:00+00:00',
  'time': 1643642100000.0,
  'open': 37724.0,
  'high': 37900.0,
  'low': 37720.0,
  'close': 37799.0,
  'volume': 25461367.2357},
 {'startTime': '2022-01-31T15:20:00+00:00',
  'time': 1643642400000.0,
  'open': 37799.0,
  'high': 37873.0,
  'low': 37774.0,
  'close': 37833.0,
  'volume': 17233801.3338}]

DataFrameの作成

DataFrame クラスに辞書やリストを渡すと、DataFrameを生成します。

df = pd.DataFrame(data["result"])
df.head()
startTime time open high low close volume
0 2022-01-31T15:00:00+00:00 1.643641e+12 37534.0 37734.0 37534.0 37673.0 3.844787e+07
1 2022-01-31T15:05:00+00:00 1.643642e+12 37673.0 37853.0 37615.0 37791.0 3.039289e+07
2 2022-01-31T15:10:00+00:00 1.643642e+12 37791.0 37819.0 37720.0 37724.0 2.318616e+07
3 2022-01-31T15:15:00+00:00 1.643642e+12 37724.0 37900.0 37720.0 37799.0 2.546137e+07
4 2022-01-31T15:20:00+00:00 1.643642e+12 37799.0 37873.0 37774.0 37833.0 1.723380e+07

データ型

dtypes 属性はDataFrameの各列のデータ型が格納されています。

df.dtypes
startTime     object
time         float64
open         float64
high         float64
low          float64
close        float64
volume       float64
dtype: object

to_datetime 関数はさまざまなオブジェクトをdatetime型に変換します。次のコードでは「startTime」列と「time」列をdatetime型に変換しています。

df.loc[:, "startTime"] = pd.to_datetime(df.loc[:, "startTime"])
df.loc[:, "time"] = pd.to_datetime(df.loc[:, "time"], unit="ms")
df.head()
startTime time open high low close volume
0 2022-01-31 15:00:00+00:00 2022-01-31 15:00:00 37534.0 37734.0 37534.0 37673.0 3.844787e+07
1 2022-01-31 15:05:00+00:00 2022-01-31 15:05:00 37673.0 37853.0 37615.0 37791.0 3.039289e+07
2 2022-01-31 15:10:00+00:00 2022-01-31 15:10:00 37791.0 37819.0 37720.0 37724.0 2.318616e+07
3 2022-01-31 15:15:00+00:00 2022-01-31 15:15:00 37724.0 37900.0 37720.0 37799.0 2.546137e+07
4 2022-01-31 15:20:00+00:00 2022-01-31 15:20:00 37799.0 37873.0 37774.0 37833.0 1.723380e+07

Plotlyによる可視化

Plotlyはインタラクティブな可視化を簡素な記述で実装できるPythonパッケージです。pandasのDataFrameと相性がよく、次のコードのようにローソク足をかんたんに作成できます。

fig = go.Figure(
    data=[
        go.Candlestick(
            x=df["startTime"],
            open=df["open"],
            high=df["high"],
            low=df["low"],
            close=df["close"],
        )
    ]
)
fig.show()
fig.write_html("candle.html")
HTML("./candle.html")

Important

あとはしんせいたろうさんに任せる