アルゴリズムの基本をJava、C#、Pythonで学ぼう - データを集計し、言語ごとの違いを知る

基本的なアルゴリズムを使った観測データの集計を考えてみます。使用するのは、Java(Java 13)、C#(C# 8.0)、Python(Python3)。ちょっとしたコードでも言語によって違いがあります。

アルゴリズムの基本をJava、C#、Pythonで学ぼう - データを集計し、言語ごとの違いを知る

最近は、便利なライブラリやAPIが多数公開されており、自分でアルゴリズムを考えるのは非効率と思えるほどです。とはいえ、基本のアルゴリズムや定番的な処理方法を押さえていないと、生産性やプログラムの品質に影響します。

この記事では、基本的なアルゴリズムを使った観測データの集計を考えてみます。使用するのは、人気言語のJava(Java 13)C#(C# 8.0)Python(Python3)。ちょっとしたコードでも言語の違いがありますので、言語選定などの参考にしてみてはいかがでしょう。

アメダスの観測データを扱う

今回扱うデータは、気象庁が提供しているアメダスの観測データです。アメダスは、「Automated Meteorological Data Acquisition System」の略で、降水量や風向・風速、気温などを自動的に観測している気象庁のシステムです。

アメダスの観測データは、気象庁のWebサイトから、CSV形式のファイルとしてダウンロード可能です。地点、項目、期間などを指定して、ダウンロードします。

1
▲ 「過去の気象データ・ダウンロード」のページ

今回は、以下のように指定しました。表示オプションはデフォルトのままです。

  • 地点を選ぶ:東京
  • 項目を選ぶ(データの種類):時別値
  • 項目を選ぶ(項目):気温
  • 期間を選ぶ:2019/1/1~2019/12/6

データの項目は「日時」「気温」「品質情報」「均質番号」の4種類。品質情報、均質番号は、観測値が正常かどうかに関する情報です。各項目の詳細については、同サイトの「ダウンロードファイル(CSVファイル)の形式」ページを参照してください。

ファイルの先頭5行には、次の画像のような項目が入っています。このまま使うとやや面倒なので、あらかじめ先頭5行分は削除し、全てデータ行のみのCSVファイルに加工しておきます。

2
▲ CSVファイルのデータ

CSVファイルの仕様にはバリエーションがあり、その全てに対応するとコードが複雑になりますので、今回は気象庁のCSVデータに基づき、次の仕様を前提とします。

  • 文字種は、ANK(1バイト文字)のみ
  • ヘッダ行なし
  • 区切り文字にはカンマを使う
  • 値は、ダブルクォートで囲まない(値にカンマや改行は含まない)

観測データの集計

観測された気温データを集計し、次の項目を求めてみます。

  1. 最高気温、最低気温と、その日時
  2. 月ごとの最高気温、最低気温、平均気温

このような集計は、実際のシステムでは、データベースを使うのが一般的でしょう。データベースを使えば比較的簡単に結果を得られます。ただ今回は、データベースを使わない(使えない)という前提で、この集計を行うプログラムを考えることにします。

処理の流れ

まずは、ざっと処理の流れを考えてみましょう。少なくとも、次のような処理が必要そうです。

  1. CSVファイルの読み込み
  2. データの抽出
  3. 集計処理
  4. 結果の表示

CSVファイルの読み込み

ひとくちにCSVファイルの読み込みといっても、言語によっていくつか方法があります。今回は、最も基本的と思われる手法を紹介することにします。

一般に、ファイルを処理するには、大きく2つの方法があります。一つは「ファイルをいったん全てメモリに読み込んでから後の処理を行う方法」、もう一つは「読み込みながら処理を行う方法」です。

ファイルサイズやデータ行の大きさ、実行する環境のメモリ容量、実行速度、さらに処理内容によって、どちらの方法を取るか考える必要があります。今回は、巨大なファイルにも対応できるように「読み込みながら処理を行う方法」を採用します。

集計処理

まず、最高気温、最低気温の日時を求める方法です。最高気温、最低気温の日時がそれぞれ1つなら、気温を基準に順番にならべて(ソート)、最初と最後の日時を表示すれば済みます。ただ実際には、同じ最高気温、最低気温の日時があり得ます。今回は、ソートを使わない方法で実装してみました。

なお、日の気温データは、1時~24時(翌日0時)の値を集計する必要があるのですが、今回は、0時~23時の値を1日分として扱います。

結果の表示

今回の集計処理の結果は、次のような内容をコンソールに表示することにします。最初に、最高気温とその日時。次に最低気温とその日時、そして、月ごとの最高気温、最低気温、平均気温です。

最高:35.3℃
2019/8/8 13:00
最低:-0.7℃
2019/1/10 6:00
 1月 最高:13.7℃ 最低:-0.7℃ 平均:5.6℃
 2月 最高:18.7℃ 最低:-0.6℃ 平均:7.2℃
 3月 最高:21.9℃ 最低:1.9℃ 平均:10.6℃
 4月 最高:25.0℃ 最低:2.5℃ 平均:13.6℃
 5月 最高:31.9℃ 最低:8.5℃ 平均:20.0℃
 6月 最高:32.0℃ 最低:14.2℃ 平均:21.8℃
 7月 最高:33.8℃ 最低:18.0℃ 平均:24.1℃
 8月 最高:35.3℃ 最低:20.9℃ 平均:28.4℃
 9月 最高:35.0℃ 最低:17.4℃ 平均:25.1℃
10月 最高:29.9℃ 最低:12.3℃ 平均:19.4℃
11月 最高:22.9℃ 最低:2.1℃ 平均:13.1℃
12月 最高:16.1℃ 最低:4.8℃ 平均:9.4℃

Javaでのプログラム

エンジニアHubに会員登録すると
続きをお読みいただけます(無料)。
登録のメリット
  • すべての過去記事を読める
  • 過去のウェビナー動画を
    視聴できる
  • 企業やエージェントから
    スカウトが届く