日付とPyCallおよび関連ライブラリを読み込みます。
require 'date'
require 'pycall/import'
include PyCall::Import
pyimport 'numpy', as: 'np'
pyimport 'pandas', as: 'pd'
2014年のデータで学習させます。
# データ読込
filename = "juyo-2014.csv"
df = pd.read_csv.(filename, encoding: "SHIFT-JIS", skiprows: 2)
df["KW"] = df.pop.("実績(万kW)")
df.head.()
# データ加工
ymd = []
month = []
wday = []
hour = []
(0..PyCall.len(df)-1).each do |i|
dt = Date.parse(df.DATE.ix[i])
ymd << dt
month << dt.month
wday << dt.wday
hour << df["TIME"].ix[i].split(":")[0]
end
df["HOUR"] = hour
df["MONTH"] = month
df["WEEK"] = wday
df.head.()
# グラフでデータを確認
pyimport 'matplotlib.pyplot', as: 'plt'
plt.figure.(figsize: PyCall.tuple(10, 3))
plt.xlim.(100,400)
plt.plot.(df.KW, label: "KW")
plt.legend.()
# グラフを画像として保存
plt.savefig.("pycall.svg")
plt.close.()
# 保存されたグラフの画像を読み込む
open("pycall.svg")
# 入力・出力に使用するデータ列の指定
x_cols = ["MONTH","WEEK","HOUR"]
y_cols = ["KW"]
nil
# 入力・出力データの取得
x = df[x_cols].as_matrix.().astype.("float")
y = df[y_cols].as_matrix.().astype.("int").flatten.()
nil
# データ分割
pyfrom 'sklearn.cross_validation', import: :train_test_split
x_train, x_test, y_train, y_test = train_test_split.(x, y, test_size: 0.1)
nil
# 正規化
pyfrom 'sklearn.preprocessing', import: :StandardScaler
scaler = StandardScaler.()
scaler.fit.(x_train)
x_train = scaler.transform.(x_train)
x_test = scaler.transform.(x_test)
nil
# 学習
pyfrom 'sklearn.ensemble', import: :RandomForestRegressor
model = RandomForestRegressor.()
model.fit.(x_train, y_train)
# スコア計算
model.score.(x_test,y_test)
# 検証
result = model.predict.(x_test)
nil
# テストデータと予測結果の比較
plt.figure.(figsize: PyCall.tuple(10, 3))
plt.title.("y_test and result")
plt.xlim.(0,100)
plt.plot.(y_test, label: "y_test")
plt.plot.(result, label: "result")
plt.legend.()
# グラフを画像として保存
plt.savefig.("pycall.svg")
plt.close.()
# 保存されたグラフの画像を読み込む
open("pycall.svg")
# 正規化と学習
scaler.fit.(x)
x_train = scaler.transform.(x)
y_train = y
model.fit.(x_train, y_train)
電力需要の予測値と2016年のデータを比較してみます。
# データ読込
filename = "juyo-2016.csv"
df = pd.read_csv.(filename, encoding: "SHIFT-JIS", skiprows: 2)
df["KW"] = df.pop.("実績(万kW)")
df.head.()
# データ加工
ymd = []
month = []
wday = []
hour = []
(0..PyCall.len(df)-1).each do |i|
dt = Date.parse(df.DATE.ix[i])
month << dt.month
wday << dt.wday
hour << df["TIME"].ix[i].split(":")[0]
end
df["HOUR"] = hour
df["MONTH"] = month
df["WEEK"] = wday
df.head.()
# 入力・出力データの取得
x = df[x_cols].as_matrix.().astype.("float")
y = df[y_cols].as_matrix.().astype.("int").flatten.()
nil
# 正規化
x_test = scaler.transform.(x)
y_test = y
nil
# スコア計算
model.score.(x_test,y_test)
# 予測
result = model.predict.(x_test)
nil
# テストデータと予測結果の比較
plt.figure.(figsize: PyCall.tuple(10, 3))
plt.title.("y_test and result")
plt.xlim.(100,400)
plt.plot.(y_test, label: "y_test")
plt.plot.(result, label: "result")
plt.legend.()
# グラフを画像として保存
plt.savefig.("pycall.svg")
plt.close.()
# 保存されたグラフの画像を読み込む
open("pycall.svg")