2012-09-12 2 views
1

저는 Matlab 스크립트를 파이썬으로 이식하고 있습니다. 아래의 추출물이다 :recfromcsv의 출력으로 작업하기

%// Create a list of unique trade dates 
DateList = unique(AllData(:,1)); 

%// Loop through the dates 
for DateIndex = 1:size(DateList,1) 

    CalibrationDate = DateList(DateIndex); 
    %// Extract the data for a single cablibration date (but all expiries) 
    SubsetIndices = ismember(AllData(:,1) , DateList(DateIndex)) == 1;  
    SubsetAllExpiries = AllData(SubsetIndices, :); 

AllData는 N -by- 6 셀 (Cell) 행렬이고, 상기 제 2 열은 기간 (현)이며, 다른 4 숫자이다. 내가 AllData 보통 튜플의 NumPy와 배열 틀리지 않는 경우 그래서 지금

import numpy as np 
AllData = np.recfromcsv(open("MyCSV.csv", "rb")) 

: 파이썬에서 나는 CSV에서이 같은 뭔가를이 데이터를 가져 오는 것입니다. 이 데이터를 가져 오는 데 가장 적합한 형식입니까? 목표는 1 열에서 고유 한 날짜 목록을 추출하고 각 날짜에 대해 1 열 (날짜 1 열)에 해당 날짜가있는 행을 추출합니다. 그런 다음 1 열의 각 행에 대해 나머지 5 열의 숫자와 날짜에 대한 몇 가지 계산을 수행하십시오.

SubsetIndices = ismember(AllData(:,1) , MyDate) == 1;  
SubsetAllExpiries = AllData(SubsetIndices, :); 

방법 : 다음과 같이 (열 하나에 해당 날짜로 즉) 그 날짜에 해당하는

그래서 MATLAB에서 나는 unique(AllData(:,1))에 의해 날짜의 목록을 얻을 수 있으며, 그때 기록 (행)를 얻을 수 있습니다 파이썬에서 같은 결과를 얻을 수 있을까요?

답변

3

문맥에 넣으려면 np.recfromcsv은 구조화 된 배열 대신 레코드 배열을 출력하는 np.genfromtxt의 수정 된 버전 일뿐입니다.

structured array는 기록 배열 my_array.field_one에 같은 속성으로 필드를 액세스하기 위해 당신에게 같은 플러스 가능성을 제공하는 동안 my_array["field_one"]에서처럼, 자신의 이름으로 (여기, 당신의 열) 개별 필드에 액세스 할 수 있습니다. 나는 "access-as-attributes"를 좋아하지 않기 때문에, 나는 보통 구조화 된 배열을 고수한다. 일부 NumPy와 객체의 하지 튜플의 배열,하지만 배열이 호출하는 정보, structurede/기록 배열

np.void : 그것은 당신이 필드로 가지고 많은 서브 블록으로 구성된 메모리 블록의 크기입니다 각 하위 블록은 해당 데이터 유형에 따라 다릅니다.

그렇습니다. 네가 염두에두고있는 것은 정확하게 구조화 된 배열의 사용법입니다. 접근 방식은 다음과 같습니다 : dates 배열을 가져와 고유 한 요소를 찾기 위해 필터링하려면

  • 입니다.
  • 이 고유 한 요소의 인덱스를 찾으려면 matching과 같은 정수 배열을 사용하십시오.
  • my_array[matching] 같이 fancy indexing를 사용하여 해당 레코드 (, 어레이의 행)를 액세스 할 matching를 사용한다.
  • 을 사용하여 원하는대로 계산을 수행 할 수 있습니다. documentation에 설명 된대로 문자열로 날짜를 유지하거나 사용자 정의 변환기를 사용 datetime 객체로 변환 할 수 있습니다

참고. 예를 들어 YYYY-MM-DDlambda s:datetime.dateime.strptime(s,"%Y-%m-%d")datetime 개체로 변환 할 수 있습니다.그런 식으로 배열 대신 각 행 (레코드)이 문자열과 4 개의 부동 소수점으로 구성된 두 개의 날짜로 구성되는 N 배열을 가지며 각 행은 두 개의 datetime 개체와 4 개의 부동 소수점으로 구성됩니다.

(N,) (my_array.shape을 통해) 배열의 모양에 주목하십시오. 복수 열이있는 2D 테이블처럼 보일지라도, 배열은 1D 배열임을 의미합니다. 이름을 사용하여 개별 필드 (각 "열")에 액세스 할 수 있습니다. 우리가 배열을 하나 개의 문자열 필드로 구성된 만드는 경우 예를 들어, 전화 firstint 필드는 그와 같은 second 전화 :

x = np.array([('a',1),('b',2)], dtype=[('first',"|S10"),('second',int)]) 

당신이 설명

>>> x['first'] 
array(['a', 'b'], 
     dtype='|S10') 
+0

감사와 first 열을 액세스 할 수 있습니다, 내가 수집 할 수있는 것부터는 '날짜 배열'이 없다. 각 요소에 2 개의 날짜와 4 개의 부동 소수점이 포함 된 np.void (표면 상으로는 나에 가까운 튜플과 유사 함)가 포함 된 배열이있다. 단일 열 (그러나 모든 행)의 배열을 얻을 수있는 방법이 있습니까? AllData [n]이 n + 1 번째 행을, AllData [n] [m]이 n + 1 번째 행의 m + 1 번째 열을 제공합니다. AllData [n] [:]이 (가) 작동하지 않고 AllData [n ,:]의 구문이 잘못되었습니다. 그렇다면 날짜 배열에 필터를 적용하려면 어떻게해야합니까? 혹시 약간의 코드를 제안 해 주시겠습니까? – Dan

+0

완료, 수정 된 버전 확인 –

+0

완벽! 감사. – Dan