LoginSignup
5
0

More than 3 years have passed since last update.

つくば市の1年間の気温の推移をプロット with F#スクリプト

Last updated at Posted at 2020-06-26
1 / 11

まとめ

image.png


気持ち

やっぱりめっちゃギザギザでつらい、最近気温の変化が激しくて体調が辛いです。

気象庁|過去の気象データのデータを利用しました。

今回はF#スクリプトからFSharp.DataXPlotをつかってみました。1ファイル完結で50行くらいなので楽ですね。


データの用意

気象庁のサイトからダウンロード

  1. 気象庁|過去の気象データから
  2. 目的の地名を選択して
  3. 1日毎の平均気温・最高気温・最低気温を選択して
  4. 10年分くらいまとめてダウンロード

image.png

image.png


CSVファイルの手直し

ヘッダーが狂ったCSVファイル(しかもShiftJIS)が降ってくるので、

data.csv
ダウンロードした時刻: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
...略

  1. ヘッダーを消去して、
  2. ShiftJISからUTF-8に変換して、 (VSCodeの機能でできますね)
  3. いい感じに書き換えます。
data.csv
- ダウンロードした時刻: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現在ではまだプレビュー版なので、以下の記事を参考に指定する必要があります。

F#スクリプトでNuGetパッケージを使って爆速開発

作業用ディレクトリにtemperatures.fsxというファイルを作る。

TemperaturesPlot
|--data.csv
|--temperatures.fsx

書いた

分けてありますが、上から順に実行されるだけなので素直な心で眺めていきましょう。

F#5.0の機能で、FSharp.DataXPlotnuget(.NETのパッケージマネージャ)から直接読み込ませます。

temperatures.fsx
#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の結果が表示された。


再掲

image.png

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0