问题来源:由于要做一个利用神经网络来训练负荷数据,以预测负荷数据,而给的数据是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列,所以需要在原程序中修改加载数据的办法,看能否直接从数据库中加载数据