見出し画像

【Python】大谷翔平のHRデータを3Dアニメーションと自動投稿で視覚化する

弾道の軌跡を視覚化し、それを反映するプロセスを自動化するプログラムを作成するのは、面白いアイデアだと思いました。そこで、以下の内容を考えてみました。

このプログラムを作るために、ChatGPTに二人の会話形式で指示を出し、情報の取得方法についてマホーン先生に教えてもらうというシナリオを用意しました。

お暇があれば、時間が許す限り読んでみてください。

登場人物

マホーン先生(エンジニア)
ロバート・ジュニア(学生)

2人の会話

ロバート・ジュニア: こんにちは、マホーン先生。大谷翔平選手のホームランの軌跡を色付きで表した3Dアニメーションを作りたいんですが、どうすればいいですか?

マホーン先生: こんにちは、ロバート・ジュニア。それは素晴らしいプロジェクトですね。PythonのMatplotlibとアニメーション機能を使えば、ホームランの軌跡を3Dで視覚化することができます。まずは、以下のコードを見てみましょう。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.animation import FuncAnimation

t = np.linspace(0, 1, 500)
x = 100 * t
y = 30 * t
z = 50 * (t - t**2) * 4

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

colors = plt.cm.viridis(np.linspace(0, 1, len(x)))

def update(num, x, y, z, line):
    line.set_data(x[:num], y[:num])
    line.set_3d_properties(z[:num])
    line.set_color(colors[num])
    return line,

line, = ax.plot(x, y, z, lw=2)
ax.set_xlim(0, 100)
ax.set_ylim(0, 30)
ax.set_zlim(0, 50)

ani = FuncAnimation(fig, update, len(x), fargs=[x, y, z, line], interval=25, blit=False)
plt.show()

このコードでは、シンプルな放物線を描いています。軌跡を色付きで表現するために、`colors`というカラーマップを使っています。


ロバート・ジュニア: 日々更新される大谷翔平選手のホームラン飛距離のデータはどこから取れるんですか?

マホーン先生: 良い質問ですね、ロバート・ジュニア。最新のデータを取得するにはいくつかの信頼できるリソースがあります。例えば、Baseball SavantMLBの公式サイトMLB Daily Dingersなどが挙げられます。これらのサイトではリアルタイムのStatcastデータを提供しており、飛距離や打球速度などの詳細な情報が得られます。

ロバート・ジュニア: データ連携して自動で取得したいんですが、どうすればいいですか?

マホーン先生: それでは、APIを利用してデータを自動取得する方法を見てみましょう。例えば、Baseball Savant APIMLB APIを使うことで、最新のホームランデータをプログラムで取得できます。以下のコードは、Baseball Savantからホームランデータを取得する例です。

import requests
import pandas as pd

player_id = 660271
url = f"https://baseballsavant.mlb.com/player/{player_id}/statcast?type=raw&season=2024"

def get_home_run_data():
    response = requests.get(url)
    data = response.json()
    df = pd.DataFrame(data['stats'])
    hr_data = df[df['events'] == 'home_run']
    hr_data = hr_data[['game_date', 'hit_distance_sc', 'launch_speed', 'launch_angle']]
    return hr_data

hr_data = get_home_run_data()
print(hr_data)

このコードを使えば、大谷翔平選手のホームランデータを自動的に取得し、保存することができます。


ロバート・ジュニア: そのデータを即座にツイートする仕組みにしたいです。

マホーン先生: それもできますよ、ロバート・ジュニア。Twitter APIを使って、自動ツイートを設定しましょう。以下のコードを参考にしてください。

import requests
import pandas as pd
import tweepy
import time

api_key = "YOUR_API_KEY"
api_key_secret = "YOUR_API_KEY_SECRET"
access_token = "YOUR_ACCESS_TOKEN"
access_token_secret = "YOUR_ACCESS_TOKEN_SECRET"

auth = tweepy.OAuth1UserHandler(api_key, api_key_secret, access_token, access_token_secret)
api = tweepy.API(auth)

player_id = 660271
url = f"https://baseballsavant.mlb.com/player/{player_id}/statcast?type=raw&season=2024"

def get_home_run_data():
    response = requests.get(url)
    data = response.json()
    df = pd.DataFrame(data['stats'])
    hr_data = df[df['events'] == 'home_run']
    hr_data = hr_data[['game_date', 'hit_distance_sc', 'launch_speed', 'launch_angle']]
    return hr_data

def post_tweet(content):
    try:
        api.update_status(content)
        print("Successfully posted tweet!")
    except tweepy.TweepError as error:
        print(f"Error: {error.reason}")

def main():
    last_posted_hr_date = None
    while True:
        hr_data = get_home_run_data()
        if not hr_data.empty:
            latest_hr = hr_data.iloc[-1]
            game_date = latest_hr['game_date']
            if game_date != last_posted_hr_date:
                hit_distance = latest_hr['hit_distance_sc']
                launch_speed = latest_hr['launch_speed']
                launch_angle = latest_hr['launch_angle']
                
                tweet_content = (
                    f"Shohei Ohtani hit a home run on {game_date}!\n"
                    f"Distance: {hit_distance} feet\n"
                    f"Exit Velocity: {launch_speed} mph\n"
                    f"Launch Angle: {launch_angle} degrees"
                )
                
                post_tweet(tweet_content)
                last_posted_hr_date = game_date
        time.sleep(3600)

if __name__ == "main__":
    main()

このコードを実行すると、大谷翔平選手のホームランデータを自動で取得し、ツイートすることができます。

ロバート・ジュニア: ありがとうございます、マホーン先生!これで大谷翔平選手のホームランデータを自動で取得してツイートすることができそうです。

マホーン先生: どういたしまして、ロバート・ジュニア。プロジェクトが成功することを祈っています。また何か質問があれば、いつでも聞いてくださいね。

この記事が気に入ったらサポートをしてみませんか?