アメダスのデータで遊んでみる～その１

ニューラルネットワークの勉強として、なんらかのデータを扱ってみたい。
そこで、簡単に入手できそうな、アメダスのデータで遊んでみることにしました。
以下のURLからデータがダウンロード出来るようです。

https://www.jma.go.jp/jma/menu/menureport.html


気象　→　過去の気象データ・ダウンロード

で、適当な地点の適当なデータが取得できそうです。
一回にダウンロードできるデータ量が限られるようなので、適当に設定して、ダウンロードしてみます。
今回は、私がよくジョギングしている近所の長野県松本市のデータを使ってみました。

![matsu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607345/53a6c765-0c72-d110-30ce-d7eae6e0c575.jpeg)


選んだ項目は･･･
■気温
■風向・風速
■天気
の3つ。
期間は適当に選択して「CSVファイルをダウンロード」というボタンをクリックすると、無事ダウンロードできました。

開いてみると、ちょっと不思議なフォーマットのようです。
![matsu_data.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607345/e44efd3a-5c3b-1855-9af7-338af24cf899.jpeg)


ヘッダが入っているのですが、なんだかちょっと崩れているかも？
Tensorflowで解析をするにはPythonにデータを取り込む必要があるのですが、今回はPandasを利用してみます。
そうすると、CSVファイルには制約が出てくるようです。
恐らくですが･･･

※1行目がヘッダ
※カンマ区切りのデータ量(列)は各行で同じ数である

あたりでしょうか。
このままじゃ使えないですし、なんせ、風向が日本語なので、数値に変換してあげることにしました。

こういうのはPerlなどのScriptを使うのが王道な気がしますが、私が使っている環境がWindowsということもあるので、VBSで簡単にプログラムを書いてみます。
以下のような感じでいかがでしょうか。
(こういうのって公開しても良いのか??･･･使う方は自己責任でお願いします)

```vb:transCSV.vbs
if WScript.Arguments.Count = 0 then
    WScript.echo("too few arguments.")
    WScript.Quit(-1)
end if

Set objFso = CreateObject("Scripting.FileSystemObject")
FileName = WScript.Arguments(0)

if objFso.FileExists(FileName) = 0 then
    WScript.echo("filename err")
    WScript.Quit(-1)
end if


tmpFileName = split(FileName,".")
outFileName = tmpFileName(0) & "_out." & tmpFileName(1)


Set objReadFile = objFso.OpenTextFile(FileName , 1, False)
Set objWriteFile = objFso.OpenTextFile(outFileName , 2, True)

If Err.Number > 0 Then
    WScript.Echo "Open Error"
Else
    ' write header
    objWriteFile.WriteLine "year,month,day,hour,temp,wind,angle,weather,"
    line_cnt = 0
    Do Until objReadFile.AtEndOfStream
        line_str = objReadFile.ReadLine
        If line_cnt > 5 then
            line_info = split(line_str,",")
            yearValue = split(split(line_info(0)," ")(0),"/")(0)
            monthValue = split(split(line_info(0)," ")(0),"/")(1)
            dayValue = split(split(line_info(0)," ")(0),"/")(2)
            hourValue = split(split(line_info(0)," ")(1),":")(0)
            temp = line_info(1)
            wind = line_info(4)
            
            strAngle = line_info(6)
            
            weather = line_info(9)

            If Not(len(temp)=0 or len(wind)=0 or len(strAngle)=0 or len(weather)=0) then
                If strcomp(strAngle,"北") = 0 then
                    angle = 0
                ElseIf strcomp(strAngle,"北北西") = 0 then
                    angle = 1
                ElseIf strcomp(strAngle,"北北西") = 0 then
                    angle = 2
                ElseIf strcomp(strAngle,"北西") = 0 then
                    angle = 3
                ElseIf strcomp(strAngle,"西北西") = 0 then
                    angle = 4
                ElseIf strcomp(strAngle,"西") = 0 then
                    angle = 5
                ElseIf strcomp(strAngle,"西南西") = 0 then
                    angle = 6
                ElseIf strcomp(strAngle,"南西") = 0 then
                    angle = 7
                ElseIf strcomp(strAngle,"南南西") = 0 then
                    angle = 8
                ElseIf strcomp(strAngle,"南") = 0 then
                    angle = 9
                ElseIf strcomp(strAngle,"南南東") = 0 then
                    angle = 10
                ElseIf strcomp(strAngle,"南東") = 0 then
                    angle = 11
                ElseIf strcomp(strAngle,"東南東") = 0 then
                    angle = 12
                ElseIf strcomp(strAngle,"東") = 0 then
                    angle = 13
                ElseIf strcomp(strAngle,"東北東") = 0 then
                    angle = 14
                ElseIf strcomp(strAngle,"北東") = 0 then
                    angle = 15
                ElseIf strcomp(strAngle,"北北東") = 0 then
                    angle = 16
                End If
                line_out_str = yearValue
                line_out_str = line_out_str & "," & monthValue
                line_out_str = line_out_str & "," & dayValue
                line_out_str = line_out_str & "," & hourValue
                line_out_str = line_out_str & "," & temp
                line_out_str = line_out_str & "," & wind
                line_out_str = line_out_str & "," & angle
                line_out_str = line_out_str & "," & weather
                objWriteFile.WriteLine line_out_str
            End If
        End If
        line_cnt = line_cnt + 1
    Loop
End If


objReadFile.Close
objWriteFile.Close
Set objReadFile  = Nothing
Set objFso = Nothing

WScript.Echo FileName & " > " & outFileName & " transport end!"
```

これを実行するには、コマンドラインから以下のように実行します。

```
cscript transCSV.vbs data.csv
```

すると、同一フォルダにdata_out.csvが出来上がりました。(途中まで表示)

```data_out.csv
hour,temp,wind,angle,weather,
1,-3.0,1.8,0,2
2,-3.2,1.7,3,2
3,-4.1,1.1,0,2
4,-4.6,1.1,9,2
5,-4.6,1.0,12,2
6,-4.5,0.6,14,2
7,-5.1,1.0,0,2
8,-4.2,0.7,16,2
9,-2.7,0.5,13,2

```

これでPandasで取り込む準備が出来ました。
他のサンプルを参考に、以下のようなPythonコードで取り込めるようです。

```
import pandas as pd
import numpy as np
import tensorflow as tf

# deta making???
csv_input = pd.read_csv(filepath_or_buffer="data_out.csv", encoding="ms932", sep=",")

# インプットの項目数（行数 * カラム数）を返却します。
print(csv_input.size)

# 指定したカラムだけ抽出したDataFrameオブジェクトを返却します。
x = np.array(csv_input[["hour","day","month"]])
y = np.array(csv_input[["wind"]])
```

というわけで、ここからどうやって遊んでみるか???
まずはニューラルネットワークを使って、回帰分析などをやってみようと思います(xからyを予測)･･･が、ちょっと長くなってしまったので、続きは次回以降に持ち越します。
最近なかなか時間が取れませんが、またどこかで続きを書く予定･･･です、頑張ってみます。