Briswell Tech Blog

ブリスウェルのテックブログです

Pythonで夏を感じる

厳しい暑さが続きますね!
この1週間、ずっと30℃超えが当たり前で梅雨はどこ?って思っておりましたが、やはり梅雨明けしたようです。

OpenWeatherMapAPIにより全世界の天気データを取得できます。
PythonからこのAPIを呼び出し、取得した天気データをグラフ化して、一足先に夏を感じたいと思います。

1. モジュールのインポート

import requests
import pandas as pd
import plotly.graph_objects as go
from pytz import timezone
from datetime import datetime

APIKEY = "" #APIキー
LATITUDE = "" #緯度
LONGITUDE = "" #経度
BG_COLOR = "#100500" #グラフ背景色
FONT_COLOR = "#fff5f3" #グラフ文字色
TITLE = "東京都港区の体感気温と湿度" #グラフタイトル

2. 天気情報を取得

url = "http://api.openweathermap.org/data/2.5/onecall"
payload = {"lat": LATITUDE, "lon": LONGITUDE, "lang": "ja", "units": "metric", "APPID": APIKEY}
weather_data = requests.get(url, params=payload).json()
tz = timezone(weather_data['timezone'])
wd = weather_data['hourly'] # 現在から48時間先までの1時間毎のデータを取得

3. 日時、体感気温、湿度をリスト化

weather_data_list = []
for w1 in wd:
    tmp_dict = {}
    tmp_dict['日時'] = datetime.fromtimestamp(w1['dt'], tz=tz).strftime("%m/%d %H時")
    tmp_dict['体感気温℃'] = int(w1['feels_like'])
    tmp_dict['湿度%'] = int(w1['humidity'])
    weather_data_list.append(tmp_dict)

df_temp = pd.json_normalize(weather_data_list)

4. グラフ化

# X軸:日時、Y軸:体感気温
trace1 = go.Scatter(
    x = df_temp['日時'],
    y = df_temp['体感気温℃'],
    mode = 'lines',
    name = '体感気温℃',
    yaxis='y1',
    line=dict(color='#da70d6')
)

# X軸:日時、Y軸:湿度
trace2 = go.Scatter(
    x = df_temp['日時'],
    y = df_temp['湿度%'],
    mode = 'lines',
    name = '湿度%',
    yaxis='y2',
    line=dict(color='#87cefa')
)

# Y2軸グラフ化
layout = go.Layout(dict(margin=dict(l=0, r=0, t=30, b=0), paper_bgcolor=BG_COLOR, plot_bgcolor=BG_COLOR,
            title=dict(text=TITLE, x=0.5, y=1.0, font=dict(color=FONT_COLOR, size=24), xanchor='center', yanchor='top', pad=dict(l=0, r=0, t=5, b=0)),
            font=dict(color=FONT_COLOR, size=18),
            xaxis=dict(title='日時', showgrid=False),
            yaxis=dict(title='体感気温℃', side = 'left', showgrid=False, range = [10, 40]),
            yaxis2=dict(title='湿度%', side = 'right', overlaying = 'y', showgrid=False, range = [40, 100])
))
fig = go.Figure(dict(data = [trace1,trace2], layout = layout))

# グラフ画像を保存
fig.write_image("weather_graph.png", height=400, width=1600, scale=1)

5. 結果

夏ですね!
ただ日中の湿度はそこまで高くないのでハワイのようにカラッとして過ごしやすそうです。