On the wire · 04:57:23 UTC Live 567 · Prematch 14,380 · Markets 56,895 Vol. I · No. 5 · Friday 13 November 2026 wss://pinnfeed.io/v1/stream
PinnFeed
回答 · Python · pandas

ピナクルのオッズをpandasのDataFrameに入れる

更新日 · PinnFeed · 約1分で読めます

回答: 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)に渡してください。

WebSocketプラン:Builder、月額99ユーロ

ピナクルのオッズを1本のWebSocketでリアルタイムに。全13競技、全マーケット、マージンなしのフェアオッズとクロージングオッズ。3日間無料、ワンクリックで解約できます。

Form K-1 · Free API key

Get your free API key.

One field. No password, no card: enter your email, click the link we send, and your key is on screen.

By continuing you agree to the Terms and Privacy Policy.

One free key per email. Link valid for 20 minutes.