0
3

More than 3 years have passed since last update.

アメダスのデータで遊んでみる~その1

Posted at

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

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

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

matsu.jpg

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

開いてみると、ちょっと不思議なフォーマットのようです。
matsu_data.jpg

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

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

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

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

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を予測)・・・が、ちょっと長くなってしまったので、続きは次回以降に持ち越します。
最近なかなか時間が取れませんが、またどこかで続きを書く予定・・・です、頑張ってみます。

0
3
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
0
3