GHCNdデータセットの正式名称はGlobal Historical Climatology Network daily(世界歴史気候ネットワーク日次データ)です。 これはNOAAが公開している世界中の観測所データセットで、1763年からのデータが含まれており、世界中の約12万の気象観測所からの日々の気象観測データが収録されています。 GHCNdデータセットの月次集計バージョンはGlobal Historical Climatology Network monthly(世界歴史気候ネットワーク月次データ)です。

週末にこのデータセットの統計分析を行ったので、その処理の流れを記録しておきます。

まず、データを同期します。このデータセットはNOAA自身のサーバーとAWS/GCPのパブリックデータセットの両方に保存されています。 簡単にするため、AWSのデータセットを選びました。最初はAWS CLIを使用してデータを同期しましたが、JuiceFSを使用して同期することもできます。

1
2
3
4
5
6
7
# AWS CLIによる同期
aws s3 cp --region us-west-2 --no-sign-request s3://noaa-ghcn-pds.s3.amazonaws.com/ghcnd-stations.txt data/ghcnd-stations.txt
aws s3 cp --recursive --region us-west-2 --no-sign-request s3://noaa-ghcn-pds.s3.amazonaws.com/parquet/by_station data/parquet/by-station

# JuiceFSによる同期
juicefs sync s3://noaa-ghcn-pds.s3.amazonaws.com/ghcnd-stations.txt data/ghcnd-stations.txt
juicefs sync s3://noaa-ghcn-pds.s3.amazonaws.com/parquet/by_station data/parquet/by-station

その後、日次と月次のデータ統計作業を行いました。

核心はPolarsを利用して、指定した時間範囲で必要な統計情報を計算することです。例えば、日次の統計計算は以下のようになります:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 日次統計の計算
daily_df = (
    df.group_by_dynamic("DATE", every="1d")
    .agg(
        pl.col("DATA_VALUE").mean().alias(f"{element}_MEAN"),
        pl.col("DATA_VALUE").min().alias(f"{element}_MIN"),
        pl.col("DATA_VALUE").max().alias(f"{element}_MAX"),
        pl.col("DATA_VALUE").quantile(0.1).alias(f"{element}_P10"),
        pl.col("DATA_VALUE").quantile(0.2).alias(f"{element}_P20"),
        pl.col("DATA_VALUE").quantile(0.5).alias(f"{element}_P50"),
        pl.col("DATA_VALUE").quantile(0.8).alias(f"{element}_P80"),
        pl.col("DATA_VALUE").quantile(0.9).alias(f"{element}_P90"),
        pl.col("DATA_VALUE").sum().alias(f"{element}_SUM"),
        pl.col("DATA_VALUE").count().alias(f"{element}_COUNT"),
    )
    .collect()
)

そして、Matplotlibを使って可視化しました:

日次データ月次データ
北京
上海
東京

処理コードはGitHubで公開しています:ringsaturn/ghcn-showcases。 また、GitHub Pagesで一部の観測所の統計情報を表示する静的ページも提供しています:ghcn-showcases

ウェブページの表示プレビュー:

北京の表示プレビュー

北京の表示プレビュー

上海の表示プレビュー

上海の表示プレビュー

北京/上海/東京の気温比較

北京/上海/東京の気温比較

北京/上海/東京の降水量比較

北京/上海/東京の降水量比較