回答 · Python · pandas
ピナクルのオッズをpandasのDataFrameに入れる
回答: GET /v1/oddsを呼び、イベント → マーケット → アウトカムの順にたどって、アウトカムごとに1行を作ります。価格ごとにdecimal、fair、fairProb、margin、maxStakeを持つ整ったDataFrameになり、groupby、Parquet、ノートブックにそのまま使えます。すべてのプランで動き、無料プランではデータが30秒遅れます。
コード#
# pip install requests pandas
import os, requests, pandas as pd
r = requests.get(
"https://pinnfeed.io/v1/odds",
headers={"x-api-key": os.environ["PINNFEED_KEY"]}, # ps_live_...
params={"sport": "soccer", "main": "true", "limit": 200},
timeout=20,
)
r.raise_for_status()
rows = []
for ev in r.json()["events"]:
for m in ev.get("markets", []):
for o in m.get("outcomes", []):
rows.append({
"event_id": ev["id"], "start": ev.get("startTime"), "live": ev.get("live"),
"league": (ev.get("league") or {}).get("name"),
"home": ev.get("home"), "away": ev.get("away"),
"market": m.get("type"), "period": m.get("period"), "line": m.get("line"),
"margin": m.get("margin"), "max_stake": m.get("maxStake"),
"outcome": o.get("name"), "decimal": o.get("decimal"),
"fair": o.get("fair"), "fair_prob": o.get("fairProb"),
})
df = pd.DataFrame(rows)
df["start"] = pd.to_datetime(df["start"], utc=True)
print(df.groupby("market")["margin"].describe())
df.to_csv("pinnacle_soccer.csv", index=False)
次のステップ#
- 流動性のあるマーケット:
df[df.max_stake >= 100]。 - 200イベントを超える場合:
offsetでページング(RESTドキュメント)。 - BuilderでのCLV用クロージングオッズ:
/v1/closing/{id}。 - ポーリングなしでライブの変化を受け取る:WebSocketクライアント。
プラン#
無料(0ユーロ):30秒遅延、2競技、主要マーケット、1日1,000リクエスト。Hobby(月額29ユーロ):リアルタイムのREST。Builder(月額99ユーロ):WebSocket、全マーケット、クロージング履歴。3日間のトライアルがあります。カード登録が必要で、解約しない場合は3日目の後に課金されます。
18歳以上の方を対象とした教育目的のコンテンツです。予想や利益の約束ではありません。日本では刑法により賭博は原則として禁止されています。
よくある質問#
なぜアウトカムごとに1行なのですか?#
価格が1つの列に収まり、フィルター、ピボット、結合が簡単になるからです。マーケットごとに1行にするには:df.pivot_table(index=["event_id","market","line"], columns="outcome", values="decimal")。
JupyterやColabでも動きますか?#
はい。共有しないセルでos.environ["PINNFEED_KEY"] = "ps_live_..."としてキーを設定してください。
polars版はありますか?#
同じrowsリストをpolars.DataFrame(rows)に渡してください。