问题来源:由于要做一个利用神经网络来训练负荷数据,以预测负荷数据,而给的数据是excel以一列的形式给出,一年的数据,每一个小时一个数据。共8788
而需要做成txt形式:一行显示3周数据,其中2周是输入,一周输出,用来训练数据,这样一行就有504个数据。
在这里需要做50组训练数据,20组测试数据,显然手动转换是非常困难的,而且要从列转行,非常费时,果断先转换成sql,然后用sql语句来实现。
1、归一化表格数据
如果不采用归一化,那么训练速度回非常慢
这里采用归一化的常用公式:
X=(X-min)/(max-min)
在表格中果断采用公式来实现
步骤:
在一个单元中写入 =MIN(A2:A8788)
这样就能求出A2:A8788之间的最小值了,同理可以求出最大值,
接下来再新的一列中第一个写入 =(A2-30)/(430-30),30为最小值,430为最大值
然后往下拉动即可完成所有数据的归一化转化任务,转化后的效果如下图所示
2、先将excel中的数据导入到sql中,方便用sql语句来操作
但是遇到问题,转化的时候无法将所有行导入,后来才发现解决方案,
导入的时候,必须选择下面那个,才可以,具体是什么原因,待我后面查看书籍再做解释。
3、新建表
由于需要建立多列,从v1...v504,手动建立显然太费时,果断用sql语句
代码如下:
use DAD
--判断表是否存在
if object_id('aatest') is not null
drop table aatest
declare @ss varchar(8000)
declare @i int
set @ss=''
set @i=1
--建立504列的表
while @i<505
begin
<span style="white-space:pre"> </span>--注意连接和转换方式
<span style="white-space:pre"> </span>if @i!=1
<span style="white-space:pre"> </span>set @ss=@ss+','
<span style="white-space:pre"> </span>set @ss=@ss+'v'+convert(varchar(100),@i)+ ' float'
<span style="white-space:pre"> </span>set @i=@i+1
end
set @ss='create table aatest ('+@ss+')'
print @ss
exec(@ss)
结果如下:
4、训练数据的形成
需要将表aadata中的数据,以特定的形式转换到aatest中来。
一次取504个数据,每次循环向后推24个数据(即一天)
实现代码如下:
use DAD
declare @xh int
declare @value float
declare @s1 varchar(4000)--存储字符串1
declare @s2 varchar(4000)--存储字符串2
declare @ss varchar(8000)--连接@s1与@s2
declare @i int
declare @count int --记得声明类型
set @count=1
while @count<24*70 --24*70 共70组数据,每次往后推一天
begin
set @i=0
set @s1='' --一定要记得初始化,否则执行@s1=@s1+..的时候出现错误
set @s2=''
set @ss=''
--声明游标
declare cur cursor for --记住一定要接一个查询的语句,而且不能使exec形式的
select gyvalue from aadata where bianhao<=(@count+503) and bianhao>=@count
--打开游标
open cur
--取得每行的值(fetch)
fetch next from cur into @value
while(@@fetch_status=0)
begin
set @i=@i+1
set @s1=@s1+'v'+convert(varchar(100),@i)
set @s2=@s2+convert(varchar(100),@value)
if @i<504
begin --有两行以上的一定要用begin end,因为没有括号
set @s1=@s1+','
set @s2=@s2+','
end
else
break
fetch next from cur into @value
end
--关闭游标
close cur
--释放游标
deallocate cur
set @ss='insert into aatest('+@s1+')'+'values('+@s2+')'
--print @ss
exec(@ss)
set @count=@count+24
end
结果如下:
接下来将其导出为txt的形式
在这里,我将前70行作为测试数据,后20行作为测试数据,结果如下
但是结果显示,txt无法一次显示504列,excel最多只能有256列,所以需要在原程序中修改加载数据的办法,看能否直接从数据库中加载数据