關於我的論文課題。
目前實驗在預處理數據階段,關於瓦斯預警系統的實現。
原始數據爲access存儲的一年的數據。是KJ70系統所用到的處理數據。
裏面的格式是一個庫裏有一個月每天的數據,以及這一個月裏的報警情況。
昨天試了一下用matlab不太適應。上手不快,所以數據預處理放在ruby裏實現,得到學習樣本,然後放到matlab裏訓練網絡模型。
----基本思路是這樣。
下面跟ruby處理數據庫的方法。
首先是用ODBC連接數據庫。ruby裏面已經集成了DBI了,所以直接:
require 'DBI'
conn = DBI.connect('DBI:ODBC:01','elite','system_project')
current_tables=conn.tables
rs = conn.select_all('SELECT * FROM TABLE')
可以根據current_tables.class和rs.class看到這兩個變量都是array型的。下面的操作就比較簡單了。
整個原始數據的處理代碼:
require 'DBI'
conn = DBI.connect('DBI:ODBC:01','elite','system_project')
current_tables=conn.tables
def get_column_names(connection,table_name)
connection.columns(table_name).collect { |i| i.name }
end
columns=get_column_names(conn,'01')
column_time=columns[0]
column_position=columns[1]
column_equip=columns[2]
column_data=columns[3]
def process_date(timestamp,tablename)
str=timestamp.to_s
arr=str.split(" ")
year=2006
month=1
day=tablename.to_i
t=arr[1].split('.')[0].split(':')
hour=t[0].to_i
min=t[1].to_i
sec=t[2].to_i
(day-1)*24*60*60+hour*60*60+min*60+sec
end
def update_time(arr,month)
arr.each do |elem|
elem[0]=process_date(elem[0],month)
end
arr.sort_by{|x| x[0]}
end
month=nil
gas_rs=wind_rs=tpt_rs=co_rs=prs_rs=Array.new
(1..2).each do |i|
if i<10
month="0"+i.to_s
else
month=i.to_s
end
gm=conn.select_all("select #{column_time},#{column_data} from #{month} where #{column_position}=21")
wm=conn.select_all("select #{column_time},#{column_data} from #{month} where #{column_position}=22")
tm=conn.select_all("select #{column_time},#{column_data} from #{month} where #{column_position}=25")
cm=conn.select_all("select #{column_time},#{column_data} from #{month} where #{column_position}=26")
pm=conn.select_all("select #{column_time},#{column_data} from #{month} where #{column_position}=4")
#update database 01 time attribute
gas_rs.push(update_time(gm,month.to_i))
wind_rs.push(update_time(wm,month.to_i))
tpt_rs.push(update_time(tm,month.to_i))
co_rs.push(update_time(cm,month.to_i))
prs_rs.push(update_time(pm,month.to_i))
end
def create_seq(gas,wind,tpt,co,prs)
value=Array.new
(0..gas.length-2).to_a.each do |i|
value[i]=[gas[i][0],gas[i][1],wind[i][1],tpt[i][1],co[i][1],prs[i][1]]
end
value
end
seq1= create_seq(gas_rs,wind_rs,tpt_rs,co_rs,prs_rs).sort
msq = DBI.connect('DBI:ODBC:seq','root','')
msq.do("CREATE TABLE seq1 (
time INT NOT NULL primary key,
gas float NOT NULL,
wind_speed FLOAT,
temperature FLOAT,
carbon_monoxide FLOAT,
air_pressure FLOAT)")
msq.do("INSERT INTO seq1 (time,gas,wind_speed,temperature,carbon_monoxide,air_pressure)
VALUES
(#{seq1[0]},#{seq1[1].to_f},#{seq1[2].to_f},#{seq1[3].to_f},#{seq1[4].to_f})
")
msq.do("INSERT INTO seq1 (time)
VALUES
(#{seq1[0].to_i})
")
(0..seq1.length-1).each do |i|
msq.do("INSERT INTO seq1 (time,gas,wind_speed,temperature,carbon_monoxide,air_pressure)
VALUES
(#{seq1[i][0]},#{seq1[i][1]},#{seq1[i][2]},#{seq1[i][3]},#{seq1[i][4]},#{seq1[i][5]})
")
end
conn = DBI.connect('DBI:ODBC:01','elite','system_project')
current_tables=conn.tables
def get_column_names(connection,table_name)
connection.columns(table_name).collect { |i| i.name }
end
columns=get_column_names(conn,'01')
column_time=columns[0]
column_position=columns[1]
column_equip=columns[2]
column_data=columns[3]
def process_date(timestamp,tablename)
str=timestamp.to_s
arr=str.split(" ")
year=2006
month=1
day=tablename.to_i
t=arr[1].split('.')[0].split(':')
hour=t[0].to_i
min=t[1].to_i
sec=t[2].to_i
(day-1)*24*60*60+hour*60*60+min*60+sec
end
def update_time(arr,month)
arr.each do |elem|
elem[0]=process_date(elem[0],month)
end
arr.sort_by{|x| x[0]}
end
month=nil
gas_rs=wind_rs=tpt_rs=co_rs=prs_rs=Array.new
(1..2).each do |i|
if i<10
month="0"+i.to_s
else
month=i.to_s
end
gm=conn.select_all("select #{column_time},#{column_data} from #{month} where #{column_position}=21")
wm=conn.select_all("select #{column_time},#{column_data} from #{month} where #{column_position}=22")
tm=conn.select_all("select #{column_time},#{column_data} from #{month} where #{column_position}=25")
cm=conn.select_all("select #{column_time},#{column_data} from #{month} where #{column_position}=26")
pm=conn.select_all("select #{column_time},#{column_data} from #{month} where #{column_position}=4")
#update database 01 time attribute
gas_rs.push(update_time(gm,month.to_i))
wind_rs.push(update_time(wm,month.to_i))
tpt_rs.push(update_time(tm,month.to_i))
co_rs.push(update_time(cm,month.to_i))
prs_rs.push(update_time(pm,month.to_i))
end
def create_seq(gas,wind,tpt,co,prs)
value=Array.new
(0..gas.length-2).to_a.each do |i|
value[i]=[gas[i][0],gas[i][1],wind[i][1],tpt[i][1],co[i][1],prs[i][1]]
end
value
end
seq1= create_seq(gas_rs,wind_rs,tpt_rs,co_rs,prs_rs).sort
msq = DBI.connect('DBI:ODBC:seq','root','')
msq.do("CREATE TABLE seq1 (
time INT NOT NULL primary key,
gas float NOT NULL,
wind_speed FLOAT,
temperature FLOAT,
carbon_monoxide FLOAT,
air_pressure FLOAT)")
msq.do("INSERT INTO seq1 (time,gas,wind_speed,temperature,carbon_monoxide,air_pressure)
VALUES
(#{seq1[0]},#{seq1[1].to_f},#{seq1[2].to_f},#{seq1[3].to_f},#{seq1[4].to_f})
")
msq.do("INSERT INTO seq1 (time)
VALUES
(#{seq1[0].to_i})
")
(0..seq1.length-1).each do |i|
msq.do("INSERT INTO seq1 (time,gas,wind_speed,temperature,carbon_monoxide,air_pressure)
VALUES
(#{seq1[i][0]},#{seq1[i][1]},#{seq1[i][2]},#{seq1[i][3]},#{seq1[i][4]},#{seq1[i][5]})
")
end
按照KJ70採集的數據,第一個月17天內的各種數據變化圖:
瓦斯濃度序列圖
風速序列圖
溫度序列圖
負壓序列圖
一氧化碳序列圖: