%% 读取年数据
function [XXnum,YYnum]=dataRead()
[numXX,txtXX,rawXX]=xlsread('XXyear.xlsx');
[numYY,txtYY,rawYY]=xlsread('YYyear.xlsx');
[m,n]=size(numXX);
XXnum=zeros(12,n); %12为2008到2020年的年数;n为年特征数
YYnum=zeros(12,1);
XXnum(1:11,:)=numXX;
YYnum=numYY;
end
%%拉格朗日插值补全法
function yy=lagrange(x1,y1,xx)
%本程序为Lagrange1插值,其中x1,y1
%为插值节点和节点上的函数值,输出为插值点xx的函数值,
%xx可以是向量。
syms x
n=length(x1);
for i=1:n
t=x1;
t(i)=[];
L(i)=prod((x-t)./(x1(i)-t)); % L向量用来存放插值基函数(基函数逆序排在数组中)
end
u=sum(L*y1);
p=simplify(u) % p是简化后的Lagrange插值函数(字符串)
yy=subs(p,x,xx); %p是以x为自变量的函数,并求xx处的函数值;
yy=eval(yy);
end
%% 年数据补全(lagrange插值)【2008-2020】
function XX1_bu=yeardata_pro() %XX1为预处理后的特征年度数据
[XXnum,YYnum]=yeardataRead; %读取数据;
XX0=bunan(XXnum); %零值对缺省数值补全;
XX1=XX0; %拉格朗日/均值对零值补全;
[m,n]=size(XX1);
for j=1:n %遍历所有特征
feature=XX1(:,j);
xnan_index=find(feature==0); %将feature中的nan位置存放在jnan_index中
inan=xnan_index; %某特征的nan的位置存放在inan中;(理解方便);
ynan=YYnum(inan); %存放nan对应的函数值,也就是秦皇岛煤炭价格
% feature(inan)=mean(xnotnan); %均值补全
for k=1:size(inan)
inan1=inan(k); %nan对应的行位置
ynan1=YYnum(inan1); %nan对应的目标值(秦皇岛煤炭价格)
xnotnan4=XX1(inan1-6:inan1-1,j);
ynotnan4=YYnum(inan1-6:inan1-1);
x_bu=lagrange(ynotnan4,xnotnan4,ynan1);
XX1(inan1,j)=x_bu;
feature(inan)=x_bu;
XX1(:,j)=feature;
end
XX1_bu=XX1;
end
%% 读取全部特征数据
function [XXnum,YYnum]=alldataRead() %读取全部数据(年数据插值处理后)
[numXX,txtXX,rawXX]=xlsread('XX_pro.xlsx');
[numYY,txtYY,rawYY]=xlsread('YY.xlsx');
XXnum=numXX(3:147,:);
YYnum=numYY
end
function [zzz]=bunan(zzz) %缺失值检测并填充为0
[m,n]=size(zzz); %所有数据
count=0; % 统计空数值;
for i=1:m
for j=1:n
count=count+isnan(zzz(i,j));
if isnan(zzz(i,j))==1
%if (isempty(zz2{i,j})==1|isnan(zz2{i,j}==1))
zzz(i,j)=0;
end
end
end
%%将年数据与月数据汇总
%% 全部特征数据补全(均值补全)
function XX1=alldata_pro() %XX1为预处理后的特征年度数据
[XXnum,YYnum]=alldataRead; %读取数据;
XX0=bunan(XXnum); %零值对缺省数值补全;
XX1=XX0; %拉格朗日/均值对零值补全;
[m,n]=size(XX1);
for j=1:n %遍历所有特征
feature=XX1(:,j);
countnan=0;
xnan=[];
ynan=[];
xnotnan_index=find(feature);% x是原特征中不为0的值
xnotnan=feature(xnotnan_index);
% ynotnan=YYnum(xnotnan_index); %存放正常x对应的函数值,也就是秦皇岛煤炭价格
xnan_index=find(feature==0); %将feature中的nan位置存放在jnan_index中
inan=xnan_index; %某特征的nan的位置存放在inan中;(理解方便);
countnan=size(xnan_index,1); %countnan 存放nan个数;
ynan=YYnum(inan); %存放nan对应的函数值,也就是秦皇岛煤炭价格
feature(inan)=mean(xnotnan); %均值补全
XX1(:,j)=feature;
XX1_bu=XX1;
end