まとめ
気持ち
やっぱりめっちゃギザギザでつらい、最近気温の変化が激しくて体調が辛いです。
気象庁|過去の気象データのデータを利用しました。
今回はF#スクリプトからFSharp.DataとXPlotをつかってみました。1ファイル完結で50行くらいなので楽ですね。
データの用意
気象庁のサイトからダウンロード
- 気象庁|過去の気象データから
- 目的の地名を選択して
- 1日毎の平均気温・最高気温・最低気温を選択して
- 10年分くらいまとめてダウンロード
CSVファイルの手直し
ヘッダーが狂ったCSVファイル(しかもShiftJIS)が降ってくるので、
ダウンロードした時刻:2020/06/26 19:21:13
,つくば(館野),つくば(館野),つくば(館野),つくば(館野),つくば(館野),つくば(館野),つくば(館野),つくば(館野),つくば(館野)
年月日,平均気温(℃),平均気温(℃),平均気温(℃),最高気温(℃),最高気温(℃),最高気温(℃),最低気温(℃),最低気温(℃),最低気温(℃)
,,,,,,,,,
,,品質情報,均質番号,,品質情報,均質番号,,品質情報,均質番号
2010/6/25,24.3,8,1,30.9,8,1,17.9,8,1
2010/6/26,24.7,8,1,28.5,8,1,20.1,8,1
...略
- ヘッダーを消去して、
- ShiftJISからUTF-8に変換して、 (VSCodeの機能でできますね)
- いい感じに書き換えます。
- ダウンロードした時刻:2020/06/26 19:21:13
-
- ,つくば(館野),つくば(館野),つくば(館野),つくば(館野),つくば(館野),つくば(館野),つくば(館野),つくば(館野),つくば(館野)
- 年月日,平均気温(℃),平均気温(℃),平均気温(℃),最高気温(℃),最高気温(℃),最高気温(℃),最低気温(℃),最低気温(℃),最低気温(℃)
- ,,,,,,,,,
- ,,品質情報,均質番号,,品質情報,均質番号,,品質情報,均質番号
+ 年月日,平均気温(℃),,,最高気温(℃),,,最低気温(℃),,
2010/6/25,24.3,8,1,30.9,8,1,17.9,8,1
2010/6/26,24.7,8,1,28.5,8,1,20.1,8,1
...略
こうなる。作業用ディレクトリに置きましょう。
F#スクリプトを書く
準備
手元の.NET Coreは3.1.201、 エディタはVSCode + Ionideを使ってます。
F#5.0の機能を利用します。2020/06/26現在ではまだプレビュー版なので、以下の記事を参考に指定する必要があります。
作業用ディレクトリにtemperatures.fsx
というファイルを作る。
TemperaturesPlot
|--data.csv
|--temperatures.fsx
書いた
分けてありますが、上から順に実行されるだけなので素直な心で眺めていきましょう。
F#5.0の機能で、FSharp.DataとXPlotをnuget(.NETのパッケージマネージャ)から直接読み込ませます。
#r "nuget: FSharp.Data"
#r "nuget: XPlot.GoogleCharts"
// ファイルパスを指定
// なお、相対パスで指定すると失敗しました。一時ディレクトリに展開されたりするから?
let [<Literal>] SourcePath = __SOURCE_DIRECTORY__ + @"/data.csv"
// 静的型付きCSV、うれしい
type Weather = FSharp.Data.CsvProvider<SourcePath>
// そのままサンプルに使ったデータを取得
let data = Weather.GetSample()
FSharp.Dataのおかげで、自動で型がついてプロパティアクセスできます。
Seq
モジュールの関数でデータを加工しましょう。
let oldestDate = (data.Rows |> Seq.head).年月日
let latestDate = (data.Rows |> Seq.last).年月日
let startDate = latestDate.AddYears(-1)
let temperatures =
data.Rows
// 直近一年分を表示したい
|> Seq.filter (fun r -> startDate <= r.年月日)
// (横軸, 縦軸)のデータの組を作る
|> Seq.map(fun r ->
(r.年月日, r.平均気温), (r.年月日, r.最高気温), (r.年月日, r.最低気温))
|> Seq.toList
// list<'T1 * 'T2 * 'T3> -> list<'T1> * list<'T2> * list<'T3>
|> List.unzip3
// XPlotが利用する形式に変換
|> fun (a, b, c) -> [a; b; c]
open XPlot.GoogleCharts
let [<Literal>] Place = "つくば(館野)"
temperatures
|> Chart.Line
|> Chart.WithOptions(
Options
( colors = [|"orange"; "red"; "blue"|]
, legend = Legend(position = "right") ))
|> Chart.WithLabels [ "平均気温"; "最高気温"; "最低気温" ]
|> Chart.WithXTitle "年月日"
|> Chart.WithYTitle "気温(℃)"
|> Chart.WithTitle (
sprintf "%sの気温の推移(%s ~ %s)"
Place ((max oldestDate startDate).ToString "yyyy/MM/dd") (latestDate.ToString "yyyy/MM/dd"))
|> Chart.WithHeight 800
|> Chart.Show
VSCode右上の三角ボタンを押して実行、ブラウザにGoogleChartの結果が表示された。
再掲