-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathweather2.py
153 lines (116 loc) · 7.43 KB
/
weather2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import streamlit as st # フロントエンドを扱うstreamlitの機能をインポート
import requests # リクエストするための機能をインポート
from datetime import datetime # 現在時刻などの時間を扱う機能をインポート
import pandas as pd # データフレームを扱う機能をインポート
import matplotlib.pyplot as plt
import matplotlib_fontja
import numpy as np
from openai import OpenAI # openAIのchatGPTのAIを活用するための機能をインポート
# アクセスの為のキーをos.environ["OPENAI_API_KEY"]に代入し、設定
import os # OSが持つ環境変数OPENAI_API_KEYにAPIを入力するためにosにアクセスするためのライブラリをインポート
# 選択肢を作成
city_code_list = {
"札幌": "016010",
"仙台": "040010",
"さいたま": "110010",
"千葉": "120010",
"東京":"130010",
"新潟": "150010",
"長野": "200010",
"名古屋": "230010",
"大阪" : "270000",
"広島": "340010",
"高知": "390010",
"福岡": "400010",
"鹿児島": "460010",
"那覇": "471010",
}
# 選択肢のデフォルトを設定
city_code_index = "東京"
st.title("天気アプリ") # タイトル
st.write("調べたい地域を選んでください。") # サブタイトル
city_code_index = st.selectbox("地域を選んでください。",city_code_list.keys()) # 選択肢のキーをst.selectboxで選択し、city_code_indexに代入
city_code = city_code_list[city_code_index] # 選択したキーからAPIのリクエストに使うcityコードに変換し、city_codeに代入
current_city_code = st.empty() # 選択中の地域を補油時するための箱をcurrent_city_codeとして用意
current_city_code.write("選択中の地域:" + city_code_index) # 用意した箱に選択肢した地域を代入し、表示させる
url = "https://weather.tsukumijima.net/api/forecast/city/" + city_code # APIにリクエストするURLを作成
response = requests.get(url) # 作成したリクエスト用URLでアクセスして、responseに代入
weather_json = response.json() # responseにjson形式の天気のデータが返ってくるので、response.json()をweather_jsonに代入
now_hour = datetime.now().hour # 現在の天気情報取得のために、現在時刻の時間をnow_hourに代入
# 今日の天気はweather_json['forecasts'][0]['chanceOfRain']
# 明日の天気はweather_json['forecasts'][1]['chanceOfRain']
# 明後日の天気はweather_json['forecasts'][2]['chanceOfRain']
# にそれぞれ格納されている
# 天気の情報を0-6時、6-12時、12-18時、18-24時の4つに分けて降水確率を今日、明日、明後日の3日間の天気を返すため、場合分けする。
if 0 <= now_hour and now_hour < 6:
weather_now = weather_json['forecasts'][0]['chanceOfRain']['T00_06'] # 今日の0-6時の降水確率を取得し、weather_nowに代入
elif 6 <= now_hour and now_hour < 12:
weather_now = weather_json['forecasts'][0]['chanceOfRain']['T06_12'] # 今日の6-12時の降水確率を取得し、weather_nowに代入
elif 12 <= now_hour and now_hour < 18:
weather_now = weather_json['forecasts'][0]['chanceOfRain']['T12_18'] # 今日の12-18時の降水確率を取得し、weather_nowに代入
else:
weather_now = weather_json['forecasts'][0]['chanceOfRain']['T18_24'] # 今日の18-24時の降水確率を取得し、weather_nowに代入
# 現在時刻の降水確率をweather_now_textに代入
weather_now_text = "現在の降水確率 : " + weather_now
st.write(weather_now_text) # 現在時刻の降水確率を表示
# 今日、明日、明後日の降水確率をDadaFrameに代入
df1 = pd.DataFrame(weather_json['forecasts'][0]['chanceOfRain'],index=["今日"]) # index名を今日という文字列に設定
df2 = pd.DataFrame(weather_json['forecasts'][1]['chanceOfRain'],index=["明日"]) # index名を明日という文字列に設定
df3 = pd.DataFrame(weather_json['forecasts'][2]['chanceOfRain'],index=["明後日"]) # index名を明後日という文字列に設定
df = pd.concat([df1,df2,df3]) # 今日、明日、明後日の降水確率を結合して一覧にしてdfに代入
st.dataframe(df) # 一覧にした降水確率を表示
# temp_now の None チェックと代替値設定
temp_now_raw = weather_json['forecasts'][0]['temperature']['max']['celsius']
temp_now = float(temp_now_raw) if temp_now_raw is not None else 0.0
# temp_old の None チェックと代替値設定
temp_old_raw = weather_json['forecasts'][-1]['temperature']['max']['celsius']
temp_old = float(temp_old_raw) if temp_old_raw is not None else 0.0
# メトリック表示
st.metric(label="今日の最高気温", value=f"{temp_now}℃", delta=f"{temp_now - temp_old}℃")
df = pd.concat([df1, df2, df3])
df = df.replace({"--%": np.nan}) # "--%"をNaNに置き換え
df = df.replace("%", "", regex=True).astype(float) # "%"を除去してfloat型に変換
# グラフを描画
fig, ax = plt.subplots()
df.T.plot(kind='bar', ax=ax)
ax.set_xlabel("時間帯")
ax.set_ylabel("降水確率 (%)")
ax.set_title(f"{city_code_index}の降水確率(今日・明日・明後日)")
ax.set_xticks(range(len(df.columns)))
ax.set_xticklabels(["0-6時", "6-12時", "12-18時", "18-24時"])
ax.legend(title="日付")
ax.set_ylim(0, 100) # y軸を0から100に設定
st.pyplot(fig)
# ここにご自身のAPIキーを入力してください!
api_key = os.getenv('OPENAI_API_KEY')
# openAIの機能をclientに代入
client = OpenAI()
content_kind_of =[
"プロの気象予報士が書いた文章",
"小学3年生が書いた文章",
"大阪弁のアナウンサーが喋る文章",
"プロレスの実況アナウンサーが喋る文章",
]
# chatGPTにリクエストするためのメソッドを設定。引数には書いてほしい内容と文章のテイストと最大文字数を指定
def run_gpt(content_kind_of_to_gpt,content_maxStr_to_gpt):
# リクエスト内容を決める
request_to_gpt = city_code_index + " の地域の過去5年間の気象データを分析して、2024年8月の天気を予測してください。内容は"+ content_maxStr_to_gpt + "文字以内で出力してください。" + "また、文章は" + content_kind_of_to_gpt + "にしてください。"
# 決めた内容を元にclient.chat.completions.createでchatGPTにリクエスト。オプションとしてmodelにAIモデル、messagesに内容を指定
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "user", "content": request_to_gpt },
],
)
# 返って来たレスポンスの内容はresponse.choices[0].message.content.strip()に格納されているので、これをoutput_contentに代入
output_content = response.choices[0].message.content.strip()
return output_content # 返って来たレスポンスの内容を返す
st.sidebar.title('ChatGPT 月間天気予報')# タイトル
# 書かせたい内容
# content_text_to_gpt = st.sidebar.text_input("書かせたい内容を入力してください!")
# 書かせたい内容のテイストを選択肢として表示する
content_kind_of_to_gpt = st.sidebar.selectbox("文章の種類",options=content_kind_of)
# chatGPTに出力させる文字数
content_maxStr_to_gpt = str(st.sidebar.select_slider('記事の最大文字数', options=[300, 500, 1000,],))
output_content_text = run_gpt(content_kind_of_to_gpt,content_maxStr_to_gpt)
st.sidebar.write(output_content_text)