ニューラルネットワークの勉強として、なんらかのデータを扱ってみたい。
そこで、簡単に入手できそうな、アメダスのデータで遊んでみることにしました。
以下のURLからデータがダウンロード出来るようです。
気象 → 過去の気象データ・ダウンロード
で、適当な地点の適当なデータが取得できそうです。
一回にダウンロードできるデータ量が限られるようなので、適当に設定して、ダウンロードしてみます。
今回は、私がよくジョギングしている近所の長野県松本市のデータを使ってみました。
選んだ項目は・・・
■気温
■風向・風速
■天気
の3つ。
期間は適当に選択して「CSVファイルをダウンロード」というボタンをクリックすると、無事ダウンロードできました。
ヘッダが入っているのですが、なんだかちょっと崩れているかも?
Tensorflowで解析をするにはPythonにデータを取り込む必要があるのですが、今回はPandasを利用してみます。
そうすると、CSVファイルには制約が出てくるようです。
恐らくですが・・・
※1行目がヘッダ
※カンマ区切りのデータ量(列)は各行で同じ数である
あたりでしょうか。
このままじゃ使えないですし、なんせ、風向が日本語なので、数値に変換してあげることにしました。
こういうのはPerlなどのScriptを使うのが王道な気がしますが、私が使っている環境がWindowsということもあるので、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が出来上がりました。(途中まで表示)
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を予測)・・・が、ちょっと長くなってしまったので、続きは次回以降に持ち越します。
最近なかなか時間が取れませんが、またどこかで続きを書く予定・・・です、頑張ってみます。