Allow instantiation of dynSeries classw with a datafile (csv, mat or m). Fixed various bugs.

For instance, the follwing syntax is allowed:

data = dynSeries('mydata.csv');

assuming that the csv file is in the matlab's path.
time-shift
Stéphane Adjemian (Charybdis) 2012-12-03 15:51:03 +01:00
parent 16cba161ac
commit f89b5cfe38
2 changed files with 221 additions and 91 deletions

View File

@ -93,7 +93,8 @@ ts.vobs = 0;
ts.name = {};
ts.tex = {};
ts.freq = [];
ts.init = dynDate();%ts.Time = dynTime();
ts.init = dynDate();
ts.time = dynDates();
ts = class(ts,'dynSeries');
@ -110,6 +111,7 @@ switch nargin
ts.init = varargin{1};
ts.freq = varargin{1}.freq;
end
return
elseif ischar(varargin{1})
% Create a dynSeries object loading data in a file (*.csv, *.m, *.mat).
if check_file_extension(varargin{1},'m')
@ -121,11 +123,25 @@ switch nargin
else
error(['dynSeries:: I''m not able to load data from ' inputname(1) '!'])
end
ts.init = init;
ts.freq = freq;
ts.data = data;
ts.name = varlist;
ts.vobs = length(varlist);
ts.nobs = size(data,1);
end
case {2,4}
if nargin==2
c = [];
a = varargin{1};
b = varargin{2};
if nargin<4
d = [];
else
d = varargin{4};
end
if nargin<3
c = [];
else
c = varargin{3};
end
% Get data, number of observations and number of variables.
ts.data = a;
@ -137,6 +153,7 @@ switch nargin
quaterly = findstr('Q',b);
monthly = findstr('M',b);
weekly = findstr('W',b);
yearly = findstr('Y',b);
if ~isempty(quaterly)
ts.freq = 4;
end
@ -146,46 +163,58 @@ switch nargin
if ~isempty(weekly)
ts.freq = 52;
end
if isempty(quaterly) && isempty(monthly) && isempty(weekly)
error('dynSeries:: Using a string as a second input argument, I can only handle weekly (W), monthly (M) or quaterly (Q) data!');
if ~isempty(yearly)
ts.freq = 1;
end
elseif isa(b,'dynDate')% If b is not a string then yearly data are assumed.
if isempty(quaterly) && isempty(monthly) && isempty(weekly) && isempty(yearly)
error('dynSeries:: Using a string as a second input argument, I can only handle weekly (W), monthly (M), quaterly (Q) or yearly (Y) data!');
end
ts.init = dynDate(b);
elseif isa(b,'dynDate') && ~isempty(b)
ts.freq = b.freq;
ts.init = b;
elseif isnumeric(b) && isreal(b) && isint(b)
ts.freq = 1;
ts.init = dynDate(b);
else
error('dynSeries::dynSeries: Wrong calling sequence!');
end
ts.Time = ts.Time.setFreq(ts.freq);
ts.Time = ts.Time.setTime(dynDate(b):dynDate(b)+ts.nobs);
else% If b is empty.
ts.freq = 1;
ts.Time = ts.Time.setFreq(1);
ts.Time = ts.Time.setTime([transpose(1:ts.nobs) ones(ts.nobs,1)]);
ts.init = dynDate(1);
end
% Get the names of the variables.
if ~isempty(c)
if ts.vobs==size(c,1)
ts.name = c;
if ts.vobs==length(c)
for i=1:ts.vobs
ts.name = vertcat(ts.name, c(i) );
end
else
error('dynSeries:: The number of declared names does not match the number of variables!')
error('dynSeries::dynSeries: The number of declared names does not match the number of variables!')
end
else
for i=1:ts.vobs
ts.name = char(ts.name,'--NA--');
ts.name = vertcat(ts.name, {'--NA--'});
end
end
if ~isempty(d)
if ts.vobs==size(d,1)
ts.tex = d;
if ts.vobs==length(d)
for i=1:ts.vobs
ts.tex = vertcat(ts.tex, d(i));
end
else
error('dynSeries:: The number of declared tex names does not match the number of variables!')
error('dynSeries::dynSeries: The number of declared tex names does not match the number of variables!')
end
else
for i=1:ts.vobs
ts.tex = char(ts.tex,'--NA--');
ts.tex = vertcat(ts.tex, {'--NA--'});
end
end
otherwise
error('dynSeries:: Can''t instantiate the class, wrong calling sequence!')
error('dynSeries::dynSeries: Can''t instantiate the class, wrong calling sequence!')
end
ts.time = ts.init:(ts.init+ts.nobs);
%@test:1
%$ % Test if we can instantiate an empty dynSeries object.
@ -200,39 +229,153 @@ end
%@eof:1
%@test:2
%$ % Define a data set.
%$ A = transpose(1:10);
%$ t = zeros(4,1);
%$
%$ % Define initial date
%$ B1 = 1950;
%$ B2 = '1950Q2';
%$ B3 = '1950M10';
%$ B4 = '1950W50';
%$ try
%$ aa = dynDate('1938M11');
%$ ts = dynSeries(aa);
%$ t(1) = 1;
%$ catch
%$ t = 0;
%$ end
%$
%$ % Define expected results.
%$ e1.Time = transpose([1950 1951 1952 1953 1954 1955 1956 1957 1958 1959]);
%$ e1.freq = 1;
%$ e2.Time = char('1950Q2','1950Q3','1950Q4','1951Q1','1951Q2','1951Q3','1951Q4','1952Q1','1952Q2','1952Q3');
%$ e2.freq = 4;
%$ e3.Time = char('1950M10','1950M11','1950M12','1951M1','1951M2','1951M3','1951M4','1951M5','1951M6','1951M7');
%$ e3.freq = 12;
%$ e4.Time = char('1950W50','1950W51','1950W52','1951W1','1951W2','1951W3','1951W4','1951W5','1951W6','1951W7');
%$ e4.freq = 52;
%$ if length(t)>1
%$ t(2) = dyn_assert(ts.freq,12);
%$ t(3) = dyn_assert(ts.init.freq,12);
%$ t(4) = dyn_assert(ts.init.time,[1938, 11]);
%$ end
%$
%$ % Call the tested routine.
%$ ts1 = dynSeries(A,B1);
%$ ts2 = dynSeries(A,B2);
%$ ts3 = dynSeries(A,B3);
%$ ts4 = dynSeries(A,B4);
%$
%$ % Check the results.
%$ t(1) = dyn_assert(getTime(ts1),e1.Time);
%$ t(2) = dyn_assert(getTime(ts2),e2.Time);
%$ t(3) = dyn_assert(getTime(ts3),e3.Time);
%$ t(4) = dyn_assert(getTime(ts4),e4.Time);
%$ t(5) = dyn_assert(ts1.freq,e1.freq);
%$ t(6) = dyn_assert(ts2.freq,e2.freq);
%$ t(7) = dyn_assert(ts3.freq,e3.freq);
%$ t(8) = dyn_assert(ts4.freq,e4.freq);
%$ T = all(t);
%@eof:1
%@eof:2
%@test:3
%$ t = zeros(6,1);
%$
%$ try
%$ ts = dynSeries('dynseries_test_data.m');
%$ t(1) = 1;
%$ catch
%$ t = 0;
%$ end
%$
%$ if length(t)>1
%$ t(2) = dyn_assert(ts.freq,4);
%$ t(3) = dyn_assert(ts.init.freq,4);
%$ t(4) = dyn_assert(ts.init.time,[1994, 3]);
%$ t(5) = dyn_assert(ts.vobs,2);
%$ t(6) = dyn_assert(ts.nobs,100);
%$ end
%$
%$ T = all(t);
%@eof:3
%@test:4
%$ t = zeros(6,1);
%$
%$ try
%$ ts = dynSeries('dynseries_test_data.mat');
%$ t(1) = 1;
%$ catch
%$ t = 0;
%$ end
%$
%$ if length(t)>1
%$ t(2) = dyn_assert(ts.freq,4);
%$ t(3) = dyn_assert(ts.init.freq,4);
%$ t(4) = dyn_assert(ts.init.time,[1994, 3]);
%$ t(5) = dyn_assert(ts.vobs,2);
%$ t(6) = dyn_assert(ts.nobs,100);
%$ end
%$
%$ T = all(t);
%@eof:4
%@test:5
%$ t = zeros(7,1);
%$
%$ try
%$ ts = dynSeries('dynseries_test_data.csv');
%$ t(1) = 1;
%$ catch
%$ t = 0;
%$ end
%$
%$ if length(t)>1
%$ t(2) = dyn_assert(ts.freq,4);
%$ t(3) = dyn_assert(ts.init.freq,4);
%$ t(4) = dyn_assert(ts.init.time,[1990, 1]);
%$ t(5) = dyn_assert(ts.vobs,4);
%$ t(6) = dyn_assert(ts.nobs,4);
%$ t(7) = dyn_assert(ts.name,{'azert';'yuiop';'qsdfg';'jklm'});
%$ end
%$
%$ T = all(t);
%@eof:5
%@test:6
%$ t = zeros(7,1);
%$
%$ try
%$ ts = dynSeries(transpose(1:5),[]);
%$ t(1) = 1;
%$ catch
%$ t = 0;
%$ end
%$
%$ if length(t)>1
%$ t(2) = dyn_assert(ts.freq,1);
%$ t(3) = dyn_assert(ts.init.freq,1);
%$ t(4) = dyn_assert(ts.init.time,[1, 1]);
%$ t(5) = dyn_assert(ts.vobs,1);
%$ t(6) = dyn_assert(ts.nobs,5);
%$ t(7) = dyn_assert(ts.name,{'--NA--'});
%$ end
%$
%$ T = all(t);
%@eof:6
%@test:7
%$ t = zeros(7,1);
%$
%$ try
%$ ts = dynSeries(transpose(1:5),'1950Q1');
%$ t(1) = 1;
%$ catch
%$ t = 0;
%$ end
%$
%$ if length(t)>1
%$ t(2) = dyn_assert(ts.freq,4);
%$ t(3) = dyn_assert(ts.init.freq,4);
%$ t(4) = dyn_assert(ts.init.time,[1950, 1]);
%$ t(5) = dyn_assert(ts.vobs,1);
%$ t(6) = dyn_assert(ts.nobs,5);
%$ t(7) = dyn_assert(ts.name,{'--NA--'});
%$ end
%$
%$ T = all(t);
%@eof:7
%@test:8
%$ t = zeros(7,1);
%$
%$ try
%$ ts = dynSeries([transpose(1:5), transpose(6:10)],'1950Q1',{'Output'; 'Consumption'}, {'Y_t'; 'C_t'});
%$ t(1) = 1;
%$ catch
%$ t = 0;
%$ end
%$
%$ if length(t)>1
%$ t(2) = dyn_assert(ts.freq,4);
%$ t(3) = dyn_assert(ts.init.freq,4);
%$ t(4) = dyn_assert(ts.init.time,[1950, 1]);
%$ t(5) = dyn_assert(ts.vobs,2);
%$ t(6) = dyn_assert(ts.nobs,5);
%$ t(7) = dyn_assert(ts.name,{'Output'; 'Consumption'});
%$ end
%$
%$ T = all(t);
%@eof:8

View File

@ -69,9 +69,9 @@ function us = subsref(ts, S)
% AUTHOR(S) stephane DOT adjemian AT univ DASH lemans DOT fr
if isequal(S.type,'.') & length(S)==1
if length(S)==1 && isequal(S.type,'.')
switch S.subs
case {'data','nobs','vobs','name','tex','freq','time','init','last','Time'} % Public members.
case {'data','nobs','vobs','name','tex','freq','time','init'} % Public members.
us = builtin('subsref', ts, S);
case {'log','exp'} % Give "dot access" to public methods.
us = feval(S.subs,ts);
@ -85,9 +85,7 @@ if isequal(S.type,'.') & length(S)==1
us.nobs = ts.nobs;
us.vobs = 1;
us.freq = ts.freq;
us.time = ts.time;
us.init = ts.init;
us.last = ts.last;
return
else
error('dynSeries::subsref: Unknown public method, public member or variable!')
@ -95,7 +93,8 @@ if isequal(S.type,'.') & length(S)==1
end
return
end
if isequal(S.type,'()') & length(S)==1 % Extract a sub-object by selecting a sub-sample.
if length(S)==1 && isequal(S.type,'()') % Extract a sub-object by selecting a sub-sample.
us = dynSeries();
if size(ts.data,2)>1
S.subs = [S.subs, ':'];
@ -105,15 +104,15 @@ if isequal(S.type,'()') & length(S)==1
us.vobs = ts.vobs;
us.freq = ts.freq;
us.time = builtin('subsref', ts.time, S);
us.init = us.time(1,:);
us.last = us.time(end,:);
us.init = ts.init+S.subs{1}(1);
us.name = ts.name;
us.tex = ts.tex;
return
end
if (length(S)==2) & (isequal(S(1).subs,'Time'))
if isequal(S(2).type,'.')
us = builtin('subsref', ts.Time, S(2));
if (length(S)==2) && (isequal(S(1).subs,'init'))
if isequal(S(2).type,'.') && ( isequal(S(2).subs,'freq') || isequal(S(2).subs,'time') )
us = builtin('subsref', ts.init, S(2));
else
error('dynSeries:subsref:: I don''t understand what you are trying to do!')
end
@ -125,7 +124,7 @@ end
%$ A = [transpose(1:10),2*transpose(1:10)];
%$
%$ % Define names
%$ A_name = char('A1','A2');
%$ A_name = {'A1';'A2'};
%$
%$ % Instantiate a time series object.
%$ ts1 = dynSeries(A,[],A_name,[]);
@ -137,20 +136,16 @@ end
%$ e.data = [transpose(2:9),2*transpose(2:9)];
%$ e.nobs = 8;
%$ e.vobs = 2;
%$ e.name = char('A1','A2');
%$ e.name = {'A1';'A2'};
%$ e.freq = 1;
%$ tmp = ts1.time; e.time = tmp(2:9,:);
%$ e.init = e.time(1,:);
%$ e.last = e.time(end,:);
%$ e.init = dynDate(2);
%$
%$ % Check the results.
%$ t(1) = dyn_assert(a.data,e.data);
%$ t(2) = dyn_assert(a.time,e.time);
%$ t(3) = dyn_assert(a.nobs,e.nobs);
%$ t(4) = dyn_assert(a.vobs,e.vobs);
%$ t(5) = dyn_assert(a.freq,e.freq);
%$ t(6) = dyn_assert(a.init,e.init);
%$ t(7) = dyn_assert(a.last,e.last);
%$ t(2) = dyn_assert(a.nobs,e.nobs);
%$ t(3) = dyn_assert(a.vobs,e.vobs);
%$ t(4) = dyn_assert(a.freq,e.freq);
%$ t(5) = dyn_assert(a.init,e.init);
%$ T = all(t);
%@eof:1
@ -160,7 +155,7 @@ end
%$ A = [transpose(1:10),2*transpose(1:10)];
%$
%$ % Define names
%$ A_name = char('A1','A2');
%$ A_name = {'A1';'A2'};
%$
%$ % Instantiate a time series object.
%$ ts1 = dynSeries(A,[],A_name,[]);
@ -172,20 +167,16 @@ end
%$ e.data = transpose(1:10);
%$ e.nobs = 10;
%$ e.vobs = 1;
%$ e.name = char('A1');
%$ e.name = {'A1'};
%$ e.freq = 1;
%$ e.time = [transpose(1:10),ones(10,1)];
%$ e.init = e.time(1,:);
%$ e.last = e.time(end,:);
%$ e.init = dynDate(1);
%$
%$ % Check the results.
%$ t(1) = dyn_assert(a.data,e.data);
%$ t(2) = dyn_assert(a.time,e.time);
%$ t(2) = dyn_assert(a.init,e.init);
%$ t(3) = dyn_assert(a.nobs,e.nobs);
%$ t(4) = dyn_assert(a.vobs,e.vobs);
%$ t(5) = dyn_assert(a.freq,e.freq);
%$ t(6) = dyn_assert(a.init,e.init);
%$ t(7) = dyn_assert(a.last,e.last);
%$ T = all(t);
%@eof:2
@ -195,7 +186,7 @@ end
%$ A = [transpose(1:10),2*transpose(1:10)];
%$
%$ % Define names
%$ A_name = char('A1','A2');
%$ A_name = {'A1';'A2'};
%$
%$ % Instantiate a time series object.
%$ ts1 = dynSeries(A,[],A_name,[]);
@ -207,19 +198,15 @@ end
%$ e.data = log(A);
%$ e.nobs = 10;
%$ e.vobs = 2;
%$ e.name = char('A1','A2');
%$ e.name = {'A1';'A2'};
%$ e.freq = 1;
%$ tmp = ts1.time; e.time = tmp(1:10,:);
%$ e.init = e.time(1,:);
%$ e.last = e.time(end,:);
%$ e.init = dynDate(1);
%$
%$ % Check the results.
%$ t(1) = dyn_assert(a.data,e.data);
%$ t(2) = dyn_assert(a.time,e.time);
%$ t(3) = dyn_assert(a.nobs,e.nobs);
%$ t(4) = dyn_assert(a.vobs,e.vobs);
%$ t(5) = dyn_assert(a.freq,e.freq);
%$ t(6) = dyn_assert(a.init,e.init);
%$ t(7) = dyn_assert(a.last,e.last);
%$ t(2) = dyn_assert(a.nobs,e.nobs);
%$ t(3) = dyn_assert(a.vobs,e.vobs);
%$ t(4) = dyn_assert(a.freq,e.freq);
%$ t(5) = dyn_assert(a.init,e.init);
%$ T = all(t);
%@eof:3