Python中使用大型数据集进行OOP的好方法

时间:2018-06-02 00:06:39

标签: python matlab class oop large-data

这可能是一个软问题,但在这里。我有一个具有特定结构的大型数据集,我想转移到Python开始使用sklearn包(之前我使用的是MATLAB)。我不是Python专家,在大多数情况下你可以认为我是初学者。背景如下:

数据的结构如下。原始数据是33 x 300矩阵(比如我有大约500个这样的样本),它们是时间序列。每行来自一个生成变量,这些变量在300秒内收集。这些数据点标有标签(对应于它们的类/类型,实际上是多标签问题),名称对应于样本的收集对象,还有属性取决于何时数据积分被收集。如果在一次收集中收集,则按订单收集的点数标记为run1run2;称为session。相隔一天或多天收集的样品属于不同的会话;我有多个会话。

我如何分析MATLAB中的数据是为了创建一个我自己的类,它包含struct的数组,然后我定义了方法和函数,以便我可以添加或删除特定的样本,添加或删除来自数据集的runs,添加或删除sessions,在整个数据集中添加或删除时间序列中的行,单独考虑样本类等.MATLAB类的每个实例都保存了PCA降维的协方差矩阵; 实例的struct等其他生成的功能,如相关矩阵等。总之,它在MATLAB中约为2k行。主要目的是将数据加载到MATLAB中,实际上加载到类的实例中,然后将指令/调用列表链接到类方法,以便我可以修剪和编辑数据 - 设置我想要的。

现在问题是:

  1. 最接近这种情况的是pythonic是什么?我从list dicts方法开始,代码的某些部分感觉非常不同于pythonic。以下是从 研究或类实例中删除样本的示例

    def mod_samples(self, op, idxs):
         if not type(idxs) == list:
              print('Error: mod_samples must be called with a list of sample names!')
         if op == 'rem':
             for idx in idxs:
                 for sample in self.samples:
                     if sample['Name'] == idx:
                         self.removed_samples.append(sample)
                         self.samples.remove(sample)
         if op == 'add':
             for idx in idxs:
                 for sample in self.removed_samples:
                     if sample['Name'] == idx:
                         self.samples.append(sample)
                         self.removed_samples.remove(sample)
         self.recompute()
    
  2. 当然,必须有比使用字符串比较的双循环更优雅的方式? recompute这里只为“新”数据集再次降维等。同时强制idxs是一个列表对我来说似乎很奇怪。但另一方面,for item in itemList不区分字符串或列表。 :/

    1. 有更好的方法吗?来自实用程序包的其他一些数据类型?因为name是一个关键,我根据值而非关键字删除样本,dicts的效率似乎对我失去了。

    2. 我的MATLAB实现,因为实施深层复制是非常费力的;我通过让第二个构造函数从简化 struct而不是磁盘/数据文件创建该类的新实例来解决这个问题。例如,假设该集合的样本标记为来自run1,则调用

       dataSet.removeRun('run1') 
      

      会产生一个我可以用作

      的结构对象
       modifiedDataSet = clusterClass('isPoor', true, 'poorStruct', dataSet.removeRun('run1'))
      

      这里的问题是Python的深层复制能力是什么?我对Python中的OOP很新。我是否必须覆盖默认的复制构造函数位,变量变量,属性属性?有时 必须有两个不同的(内部)实例,因为它是出于比较的目的。

    3. 最后,速度考虑:我的数据集不是很大。我认为我保存到磁盘的.MAT文件有时通常在一天结束时大约12-15 Mb。但MATLAB几十年来一直在磨练它的内部结构,而NumPy / SciPy我认为相对较新(在MATLAB中的OOP可以被认为更新,但我没有发现它太糟糕)。我的大多数数据都是稀疏。他们在这方面的表现是否有任何提示?我所做的大部分是大型矩阵乘法,数值积分,微分等。

    4. 由于stackexchange提醒我,是的,首选是针对可以回答的问题;据说我不是在寻找 a / 的答案。我不熟悉Python中的OOP所以我只想覆盖土地,人们最喜欢的方法解决这些问题,指向我不知道这类东西的包裹等等(哦......我知道 pandas;但我不喜欢它,它为我提取了过多的内部结构,或者更确切地说......让我们很难为自己的喜好而努力。)

1 个答案:

答案 0 :(得分:1)

在一个问题中提出的问题太多了,我认为是off-topic的问题。我认为你可以通过分裂问题和切断主观部分来改善。第3部分特别难以回答。

快速浏览:

  • python / pandas不是MATLAB,永远不会,你不应该期待它们的会话功能或抱怨它不存在。它是设计的,而不是缺陷。

  • 从MATLAB迁移是一个审查数据模型及其处理方式的机会,一个路径是复制使用类的功能,另一个路径是更改数据模型,忘记会话和处理项目更像是一条管道。两者都是有效的途径。

  • 是否有新数据添加到您的数据集中还是已修复?如果有一些新数据出现,你可能想要改变你的数据pipline,或者考虑将它变平为SQL数据库,或者使用NoSQL数据库,这与存储dicts / json&,以及其他选项有效。

  

33 x 300矩阵(比如我有大约500个这样的样本)是时间序列。每行来自一个生成变量,这些行在300秒内收集。

所以有33个变量,跨越300秒,有500个这样的观察,用一些额外的属性注释?如果您需要单个数据结构,这是一个dicts列表。如果必须留在课堂上,就像你现在这样做,你可以persist a class instance

您还可以编写一个小文件管理器,将单个观察存储在自己的文件夹中,每个文件夹包含一个csv文件和一个json。

希望它不会太教诲!