使用recfromcsv的输出

时间:2012-09-12 15:41:30

标签: matlab numpy python-2.7

我正在将一个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, :);

AllData N -by- 6 单元格矩阵,前2列是日期(字符串),其他4列是数字。在python中,我将从csv中获取这些数据,如下所示:

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

所以现在如果我没有弄错AllData是一群普通的元组。这是获取此数据的最佳格式吗?目标是从第1列中提取唯一日期列表,并在每个日期中提取第1列中具有该日期的行(第1列是有序的)。然后,对于第一列中的每一行,对剩余的5列中的数字和日期进行一些数学计算。

所以在matlab中我可以通过unique(AllData(:,1))获取日期列表,然后我可以得到与该日期相对应的记录(行)(即第一列中的那个日期),如下所示:

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

如何在Python中获得最佳效果?

1 个答案:

答案 0 :(得分:3)

为了把事情放在上下文中,np.recfromcsv只是np.genfromtxt的修改版本,它输出记录数组而不是结构化数组。

structured array可让您按名称访问各个字段(此处为您的列),例如在my_array["field_one"]中,而记录数组为您提供相同的 plus my_array.field_one之类的方式访问字段作为属性。我不喜欢“作为属性访问”,所以我通常坚持使用结构化数组。

为了您的信息,structurede / record数组是元组的数组,但是一些numpy对象的数组调用np.void:它是由尽可能多的子块组成的内存块你有字段,每个子块的大小取决于它的数据类型。

那就是说,是的,你似乎想到的只是结构化数组的用法。那么方法是:

  • 获取您的dates数组并过滤它们以查找唯一元素。
  • 找到这些唯一元素的索引,作为一个整数数组,我们称之为matching;
  • 使用matching使用fancy indexing访问相应的记录(例如,您的数组的行), my_array[matching]
  • 根据需要对记录执行计算。

请注意,您可以将日期保留为字符串,或使用用户定义的转换器将其转换为datetime个对象,如documentation中所述。例如,您可以使用YYYY-MM-DDdatetime转换为lambda s:datetime.dateime.strptime(s,"%Y-%m-%d")个对象。这样,而不是拥有一个N数组,其中每一行(一个记录)由两个日期组成字符串和4个浮点数,你将有一个N数组,其中每一行包含两个{ {1}}对象和4个浮点数。

注意数组的形状(通过datetime),它表示my_array.shape,这意味着它是一维数组,即使它看起来像一个包含多列的2D表。您可以使用其名称访问各个字段(每个“列”)。例如,如果我们创建一个数组,其中包含一个名为(N,)的字符串字段和一个名为first的{​​{1}}字段,就像这样:

int

您可以使用

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