1

MatlabスクリプトをPythonに移植しています。以下は抜粋です:

%// 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, :);

AllDataN6列のセルマトリックスで、最初の2列は日付(文字列)で、他の4列は数値です。Pythonでは、このデータをcsvから取得するので、次のようになります。

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

ですから、私が間違っていなければAllData、普通のタプルの配列がたくさんあります。これは、このデータを入れるのに最適な形式ですか?目標は、列1から一意の日付のリストを抽出し、各日付について、列1にその日付の行を抽出することです(列1は順序付けられています)。次に、列1の各行について、残りの5列の数値と日付についていくつかの計算を行います。

したがって、matlabでは、日付のリストを取得unique(AllData(:,1))できます。次に、次のように、その日付に対応するレコード(行)を取得できます(つまり、その日付が1列目に含まれます)。

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

Pythonで同じ結果を最もよく達成するにはどうすればよいですか?

4

1 に答える 1

3

状況を説明すると、は、構造化配列ではなくレコード配列を出力np.recfromcsvする修正バージョンにすぎません。np.genfromtxt

構造化配列を使用すると、のように名前で個々のフィールド(ここでは列)にアクセスできますがmy_array["field_one"]、レコード配列を使用するとのように属性としてフィールドにアクセスできますmy_array.field_one。私は「属性としてのアクセス」が好きではないので、通常は構造化配列に固執します。

参考までに、structurede / record配列はタプルの配列ではありませんが、一部のnumpyオブジェクトの配列は次のように呼び出しますnp.void。これは、フィールドのサブブロックと同じ数のサブブロックで構成されるメモリのブロックであり、各サブブロックのサイズはデータ・タイプ。

そうは言っても、あなたが念頭に置いているように見えるのは、まさに構造化配列の使用法の種類です。その場合のアプローチは次のようになります。

  • 配列を取得してdatesフィルタリングし、一意の要素を見つけます。
  • これらの一意の要素のインデックスを見つけるには、整数の配列として、たとえば matching;と呼びます。
  • のように、ファンシーインデックスを 使用matchingして対応するレコード(配列の行など)アクセスするために使用します。my_array[matching]
  • 必要に応じて、レコードに対して計算を実行します。

ドキュメントdatetimeで説明されているように、日付を文字列として保持することも、ユーザー定義のコンバーターを使用してオブジェクトに変換することもできることに注意してください。たとえば、を使用してオブジェクトに変換できます。そうすれば、たとえば、各行(レコード)が文字列としての2つの日付と4つのfloatで構成される配列を作成する代わりに、各行が2つのオブジェクトと4つのfloatで構成される配列を作成できます。YYYY-MM-DDdatetimelambda s:datetime.dateime.strptime(s,"%Y-%m-%d")NNdatetime

配列の形状に注意してください(を介してmy_array.shape)。これは(N,)、複数の列を持つ2Dテーブルのように見えても、1D配列であることを意味します。名前を使用して、個々のフィールド(各「列」)にアクセスできます。たとえば、と呼ばれる1つの文字列フィールドとと呼ばれるfirst1つのintフィールドで構成される配列を作成するとsecond、次のようになります。

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

firstあなたはで列にアクセスすることができます

>>> x['first']
array(['a', 'b'], 
      dtype='|S10')
于 2012-09-12T16:03:27.660 に答える