2013-10-07 2 views
1

Excel (Excel 통합 문서의 시트 5 ~ 19에 포함 된) 시계열 데이터를 읽을 수있는 다음 코드가 있습니다. 각 워크 시트의 제목은 "TS"이고 그 뒤에 시계열 번호가옵니다. 이 프로세스는 한 가지를 제외하고는 훌륭하게 작동합니다. 모든 시계열이 5로 시프트된다는 것을 알면 반환 값을 연구합니다. 즉 TS 6은 "반환"데이터의 11 번째 열이되고 TS 19는 5 번째 열이됩니다. TS 15 첫 번째 열 등이됩니다. 나는 TS1이 첫 번째 열에 있고, TS2가 두 번째 등의 순서로 존재해야합니다. 이것은 워크 시트 ("자산 목록")는 후속 코드 전체에서 실제 주문을 유지합니다. 그러므로 내가 타이틀과 리턴을 재결합 할 때 그들은 일치하지 않는다는 것을 알게된다. 예를 들어 4 열에 "TS 4"라는 제목이 있지만 실제로 TS 18의 데이터가 포함되어있을 때 더 복잡한 조작이 필요합니다. 이 코드에 뭔가 잘못된 점이 있습니까? 매수 통해Matlab의 Excel 시계열 읽기 및 결합 - 주문 유지

FirstSheet=5; 
[~,AssetList] = xlsfinfo(XL); 
lngth=size(AssetList,2); 
AssetList(:,1:FirstSheet-1)=[]; 

% 루프 VALUES에게

merge_count = 1; 

for I=FirstSheet:lngth 



    [FundValues, ~, FundSheet] = xlsread(XL,I); 

퍼센트 추출물과 날짜 데이터를 검색하고 결합하기 :

XL='TimeSeries.xlsx'; 

formatIn = 'dd/mm/yyyy'; 
formatOut = 'mmm-dd-yyyy'; 


Bounds=3; 
[Bounds,~] = xlsread(XL,Bounds); 

퍼센트는 XLS 파일의 워크 시트의 수를 결정 % (1에서 4까지 행의 불확도를 제거하려면)

Fund_dates_data = FundSheet(4:end,1:2); 
FundDates = cellstr(datestr(datevec(Fund_dates_data(:,1),... 
            formatIn),formatOut)); 
FundData = cell2mat(Fund_dates_data(:,2)); 
% CREATE TIME SERIES FOR EACH FUND 

    Fundts{I}=fints(FundDates,FundData,['Fund',num2str(I)]); 

    if merge_count == 2 
     Port = merge(Fundts{I-1},Fundts{I},'DateSetMethod','Intersection'); 
    end 
    if merge_count > 2 
     Port = merge(Port,Fundts{I},'DateSetMethod','Intersection'); 
    end 
    merge_count = merge_count + 1; 

end 

퍼센트이 아마 merge 때문이다 포트폴리오를

Returns=tick2ret(Port); 
q = Portfolio; 
q = q.estimateAssetMoments(Returns) 
[qassetmean, qassetcovar] = q.getAssetMoments 
+0

을 : 또는 0으로 SortColumns를 설정하여 데이터를 병합 읽기/순서를 유지하기 위해 강제? 또한 Matlab 2013b에 액세스 할 수 있습니까? 왜냐하면 새로운 [readtable'] (http://blogs.mathworks.com/loren/2013/09/10/introduction-to-the-new-matlab-data-types-in-r2013b/)을 확인해야하기 때문입니다. # fe5c445a-1e68-4a44-ab40-d9cc90438539) 명령을 사용할 수 있습니다. – Dan

+0

2011 년 있습니다. 날짜 행과 시계열을 올바르게 정렬합니다. 그러나 단지 기둥을 따라 이동합니다. 너무 많은 문제는 아니지만 "경계"시트에는 통합 문서의 워크 시트 순서대로 데이터 만 포함될 수 있습니다. 이로 인해 잘못된 상한/하한이 잘못된 시계열에 지정됩니다 (예 : TS 1에 대한 경계가 TS 5에 적용되는 식으로 계속됩니다. – Mary

+0

이 정렬 오류가 발생하는 곳을 정확히 따르는 것은 여전히 ​​어렵습니다. 아마도 당신이 당신의 코드에서 사용하는 변수 이름의 용어에서 잘못 정렬 된 것이 무엇인지 질문에 추가 할 수 있습니까? – Dan

답변

1

을 분석 할 수 있습니다. 기본적으로 열은 사전 순으로 정렬됩니다. 불행하게도, 당신의 명명 패턴이 "FundN"이기 때문에 Fund10보다 Fund10이 정상적으로 정렬된다는 것을 의미합니다. 따라서 5에서 19까지 반복하면서, Fund10, Fund19, Fund4에서 Fund9까지 차례로 나타납니다.

이 문제를 해결하는 한 가지 방법은 알파벳 순서와 숫자 순서가 동일하도록 항상 제로 패딩 (Fund01, Fund02 등)을 사용하는 것입니다. 그래서 당신은`FundDates`하고`FundData`마다 루프 반복에서 정렬되지 않은 것 같은 말을

Port = merge(Port,Fundts{I},'DateSetMethod','Intersection','SortColumns',0);

+0

감사합니다. 요점을 설명하기 위해서만 TS 명명 규칙을 사용했습니다. 실제 사실 워크 시트의 이름은 단어 - 자금 이름입니다. 그러나 'SortColumns'가 여전히이 경우에도 작동 할 것이라고 제안합니까? – Mary

+0

''SortColumns ', 0'은 기본적으로 정렬을 설정하지 않기 때문에 읽기/추가 된 순서대로 열을 유지해야합니다. ([ 'Fund', num2str (I)] 예제를 사용하여 테스트). – nkjt

+0

환상적입니다. 훌륭하게 작동합니다. 감사. – Mary