ChatGPTとGoogle Bardに質問をしながら、EUのコペルニクスからERA5データを取得し、過去の天気図を作成
EUが、地球の環境監視や安全保障のためにコペルニクスという名前のWebサイトを公開しています。
そのサイトには Copernicus Data Space Ecosystem というものがって、そこから、衛星、地上、航空機、海上の観測システムから得られた膨大なデータを取得することができます。
そこで公開している全球大気再解析ERA5 のデータを取得して、過去の天気図を作成してみることにしました。ERA5は、1940年以降の気象データを緯度、経度共に0.25度のグリッドで提供しています。データの取得や天気図の作成のコードについては、ChatGPTとGoogle Bard に手伝ってもらいました。
質問をChatGPTとGoogle Bardに投げかけながらプログラムを作成し、たった3日で以下のような天気図を描くことができました。この試みは、地球環境や気候変動に関する理解を深めるための一歩に過ぎませんが、コペルニクスにある膨大なデータを活用し、AIの力を借りることで、複雑なデータ分析も容易になりました。このようなデータとツールを活用することで、皆さんも地球環境や気候変動についてより深く学ぶことができると思います。
また、ECMWFの予報データについても、サブセットが無料で公開されるようになりました。今までだと、大手の気象予報会社に就職しなければできなかったことが、個人でも可能です。
https://www.ecmwf.int/en/forecasts/datasets/open-data
ぜひ挑戦してみてください。
ChatGPT、Google Bard への質問と回答の概要は、以下のようなものです。
You
ERA5から850hPaの気温をgrib形式で取得するプログラムを教えてください。
ChatGPT
ERA5データセットから850hPaの気温をgrib形式で取得するためには、ECMWF (European Centre for Medium-Range Weather Forecasts) が提供しているAPIを使用するのが一般的です。以下はPythonを使用してERA5データを取得する基本的なステップです。なお、このプロセスを開始する前に、ECMWFのユーザー登録とAPIキーの取得が必要です。
ECMWFのアカウントを作成し、APIキーを取得する: ECMWFのウェブサイトにアクセスし、ユーザー登録を行います。登録後、APIキーを取得し、指示に従って自分のコンピュータに設定します。
必要なライブラリをインストールする: PythonでECMWFのデータにアクセスするためには、ecmwf-api-client ライブラリが必要です。これはpipを使用してインストールできます。
Pythonスクリプトを作成する: 以下のサンプルコードは850hPaの気温データをgrib形式で取得する方法を示しています。
python
from ecmwfapi import ECMWFDataServer
server = ECMWFDataServer()
server.retrieve({
'stream' : "oper",
'levtype' : "pl",
'param' : "130.128", # 130.128 is the code for temperature
'dataset' : "era5",
'levelist' : "850", # 850 hPa level
'grid' : "0.25/0.25",
'time' : "00/06/12/18",
'date' : "2022-01-01/to/2022-01-31", # Specify your date range
'type' : "an",
'class' : "ei",
'format' : "grib", # Output format
'target' : "output.grib"
})
このスクリプトを実行する前に、日付範囲('date')を必要に応じて調整してください。また、このコードはERA5データセットから特定の日付のデータを取得する例ですが、他のパラメータを変更することで異なる種類のデータや異なる時間範囲のデータを取得することも可能です。
このコードを実行すると、指定された条件に従ってデータがダウンロードされ、指定したファイル名(この例ではoutput.grib)で保存されます。
このコードは、'ecmwf.API error 1: Resource not found: datasets/era5' というエラーが出て動作しませんでした。調べていくうちに、ERA5 を取得するAPIとして CDS API があることが、そちらの方で、ChatGPTに聞いてみました。
You
CDS API を使う方法で教えてください。
ChatGPT
CDS (Climate Data Store) APIを使用してERA5データセットから850hPaの気温をgrib形式で取得するプログラムは、以下の手順で作成できます。このプロセスを実行する前に、CDSのウェブサイトでアカウントを作成し、APIキーを取得する必要があります。
CDSのアカウントを作成し、APIキーを取得する: CDSのウェブサイト(https://cds.climate.copernicus.eu/)にアクセスし、アカウントを作成します。アカウントを作成したら、APIキーを取得し、ユーザーのホームディレクトリに.cdsapircファイルを作成して、APIキーをここに保存します。
必要なライブラリをインストールする: CDS APIを使用するためには、cdsapi ライブラリが必要です。これはpipを使用してインストールできます。
pip install cdsapi
3.Pythonスクリプトを作成する: 以下のサンプルコードは850hPaの気温データをgrib形式で取得する方法を示しています。
import cdsapi
c = cdsapi.Client()
c.retrieve(
'reanalysis-era5-pressure-levels',
{
'product_type': 'reanalysis',
'format': 'grib',
'pressure_level': '850',
'variable': 'temperature',
'year': '2022',
'month': '01',
'day': '01',
'time': [
'00:00', '06:00', '12:00', '18:00',
],
},
'download.grib')
このコードでは、2022年1月1日の850hPaの気温データを取得しています。必要に応じて、年('year')、月('month')、日('day')、時間('time')を変更してください。
このスクリプトを実行すると、指定された条件に従ってデータがダウンロードされ、download.gribというファイル名で保存されます。なお、大量のデータをダウンロードする場合、時間がかかることがありますので注意してください。
このコードで動作できました。それで、Google Bard にも聞いてみました。
You
ERA5から850hPaの気温を、cdsapiを使ってgrib形式で取得するプログラムを教えてください。
Bard
<説明は省略>
import cdsapi
# プロキシ設定
cdsapi.set_server_proxy("http://proxy.example.com:8080")
# 検索条件
product = "reanalysis-era5-single-levels"
variable = "t2m"
level = "850"
# 検索
c = cdsapi.Dataset(product, variable=variable, level=level)
c.retrieve(
"grib",
time="2024-01-05/2024-01-06",
grid="0.25/0.25",
area=[131.75, 33.75, 134.25, 36.25],
)
# 出力
with open("t2m.grib", "wb") as f:
f.write(c.get_data())
こちらのGoogle Bard のコードは動作しませんでした。
次に取得したデータを使って、天気図を書くコードをChatGPTとBardに聞いてみました。
You
ERA5から850hPaの気温をgrib形式で取得しました。cartopyを使って天気図をかくコードを教えてください。
ChatGPT
ERA5データセットから850hPaの気温データ(GRIB形式)を用いて天気図を作成するには、PythonのCartopyというライブラリを使うのが一般的です。以下に基本的なステップを示し、サンプルコードを提供します。
必要なライブラリ
cartopy: 地図の描画に使用します。
matplotlib: グラフィックスの描画に使用します。
pygrib: GRIBファイルを読み込むために使用します。
ステップ
GRIBファイルを読み込みます。
気温データを抽出します。
Cartopyを使って地図上に気温データをプロットします。
サンプルコード
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import pygrib
# GRIBファイルを読み込む
grib = 'your_file.grib' # ここにGRIBファイルのパスを指定
grbs = pygrib.open(grib)
# 気温データを抽出(850hPaの気温)
grb = grbs.select(name='Temperature', level=850)[0]
# データと緯度経度を取得
data = grb.values
lats, lons = grb.latlons()
# 地図を描画
plt.figure(figsize=(10, 5))
ax = plt.axes(projection=ccrs.PlateCarree())
ax.coastlines()
ax.contourf(lons, lats, data, 60, transform=ccrs.PlateCarree())
plt.show()
このコードは基本的な構造を示しています。実際には、データの範囲、解像度、地図のスタイルなどを調整する必要があるかもしれません。また、GRIBファイルのパスは実際のファイルパスに置き換えてください。
このコードは、基本的な構造なので、xarray を使う方法を聞いてみました。
You
xarrayを使ってください
ChatGPT
xarrayを使用してERA5の850hPa気温データ(GRIB形式)を読み込み、Cartopyで天気図を描画する方法を説明します。xarrayは多次元データを扱うのに適したライブラリで、特に気象データの分析に適しています。
必要なライブラリ
xarray: データの読み込みと処理に使用します。
cfgrib: GRIBファイルをxarrayで読み込むためのバックエンドです。
matplotlib: グラフィックスの描画に使用します。
cartopy: 地図の描画に使用します。
ステップ
GRIBファイルをxarrayで読み込みます。
850hPaの気温データを抽出します。
Cartopyを使用して地図上に気温データをプロットします。
サンプルコード
import xarray as xr
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
# GRIBファイルをxarrayで読み込む
file_path = 'path_to_your_grib_file.grib' # GRIBファイルのパスを指定
ds = xr.open_dataset(file_path, engine='cfgrib')
# 850 hPaの気温データを選択
temperature_850 = ds.sel(isobaricInhPa=850)['t']
# 地図を描画
plt.figure(figsize=(10, 5))
ax = plt.axes(projection=ccrs.PlateCarree())
ax.coastlines()
import xarray as xr
# 気温データをプロット
temperature_850.plot(ax=ax, transform=ccrs.PlateCarree(), cbar_kwargs={'shrink': 0.5})
plt.show()
このコードでは、850hPaの気温データを選択して地図上にプロットしています。必要に応じて、地図の範囲やスタイル、カラーバーの設定などを調整してください。また、GRIBファイルのパスは実際のものに置き換えて使用してください。
このコードを調整することで天気図が作成できることがわかりました。Google Bard にも聞いてみました。
You
ERA5から850hPaの気温をgrib形式で取得しました。cartopyを使って天気図をかくコードを教えてください。
google bard
以下は、ERA5から850hPaの気温をgrib形式で取得し、cartopyを使って天気図をかくコードです。
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import numpy as np
import xarray as xr
# gribファイルを読み込む
ds = xr.open_dataset("850hPa_temperature.grib")
# 850hPaの気温を取得
temperature = ds["t"].values
# 等圧線を描画
ax = plt.axes(projection=ccrs.PlateCarree())
ax.contour(temperature, levels=np.arange(-40, 40, 2), colors="black", linewidths=0.7)
# 等高線を描画
ax.contourf(temperature, levels=np.arange(-40, 40, 2), cmap="RdBu")
# 国境線を描画
ax.add_feature(cfeature.BORDERS)
# タイトルを追加
ax.set_title("850hPa気温")
# 図を表示
plt.show()
このコードでは、まずimport文で必要なライブラリをインポートします。次に、open_dataset()関数を使ってgribファイルを読み込みます。values属性を使って850hPaの気温を取得します。
次に、contour()関数を使って等圧線を描画します。levels引数で等圧線の等高値を指定します。linewidths引数で等圧線の線幅を指定します。
また、contourf()関数を使って等高線を描画します。levels引数で等高線の等高値を指定します。cmap引数で等高線の色域を指定します。
さらに、add_feature()関数を使って国境線を描画します。BORDERS引数で国境線のスタイルを指定します。
最後に、set_title()関数を使ってタイトルを追加します。
このコードを実行すると、以下の天気図が表示されます。https://www.jma.go.jp/jma/kishou/know/kurashi/upper_map.html
このコードは、あくまでも一例です。任意の配色やレベルを指定したり、風向きや風速などの他の気象データを追加したりして、自由にカスタマイズすることができます。
bard のコードには、バグがあってそのままでは動作しませんが、コードを書く参考にはなります。