excel中提取数据转成txt训练的办法

来源:互联网 发布:阿里云 上海机房 编辑:程序博客网 时间:2024/04/28 00:56

问题来源:由于要做一个利用神经网络来训练负荷数据,以预测负荷数据,而给的数据是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 nulldrop table aatestdeclare @ss varchar(8000)declare @i intset @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+1endset @ss='create table aatest ('+@ss+')'print @ssexec(@ss)
结果如下:


4、训练数据的形成

需要将表aadata中的数据,以特定的形式转换到aatest中来。

一次取504个数据,每次循环向后推24个数据(即一天)

实现代码如下:

use DADdeclare @xh intdeclare @value floatdeclare @s1 varchar(4000)--存储字符串1declare @s2 varchar(4000)--存储字符串2declare @ss varchar(8000)--连接@s1与@s2declare @i intdeclare @count int --记得声明类型set @count=1while @count<24*70 --24*70 共70组数据,每次往后推一天beginset @i=0set @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 @valuewhile(@@fetch_status=0)beginset @i=@i+1set @s1=@s1+'v'+convert(varchar(100),@i)set @s2=@s2+convert(varchar(100),@value)if @i<504begin --有两行以上的一定要用begin end,因为没有括号set @s1=@s1+','set @s2=@s2+','endelse break   fetch next from cur into @valueend--关闭游标close cur--释放游标deallocate curset @ss='insert into aatest('+@s1+')'+'values('+@s2+')'--print @ssexec(@ss)set @count=@count+24end
结果如下:

接下来将其导出为txt的形式

在这里,我将前70行作为测试数据,后20行作为测试数据,结果如下



但是结果显示,txt无法一次显示504列,excel最多只能有256列,所以需要在原程序中修改加载数据的办法,看能否直接从数据库中加载数据


0 0