【问题标题】:Good approaches to OOP with large data sets in Python [closed]在 Python 中使用大型数据集实现 OOP 的好方法 [关闭]
【发布时间】:2018-11-12 02:55:01
【问题描述】:

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


数据结构如下。原始数据是一个 33 x 300 的矩阵(比如我有大约 500 个这样的样本),它们是时间序列的。每一行都来自一个 generating 变量,这些变量的收集时间超过 300 秒。这些数据点标有标签(对应于它们的类/类型,这实际上是一个多标签问题),名称对应于从谁收集样本,但也有属性取决于 when 数据积分被收集。按顺序收集的积分标记为run1run2(如果是单次收集的);称为session。相隔一天或多天采集的样本属于不同的会话;我有多个会话。

我在 MATLAB 中分析数据的方式是创建一个我自己的类,其中包含一个 structs 数组,然后我定义了方法和函数,以便我可以添加或删除特定样本,添加或删除 @987654327 @ 从数据集中添加或删除sessions,从整个数据集的时间序列中添加或删除行,分别考虑样本类别等。MATLAB 类的每个实例都保存了协方差矩阵以进行 PCA 降维; that 实例的struct 的其他生成的特征,如相关矩阵等。在 MATLAB 中总共大约有 2k 行。主要目的只是将数据加载一次到MATLAB,实际上是加载到类的实例中,然后将指令列表/对类方法的调用链接在一起,这样我就可以将数据集修剪和编辑为我想了。


现在开始提问:

  1. 在处理这种情况时,最pythonic的是什么?我从listdicts 方法开始,代码的某些部分感觉非常不符合pythonic。这是一个从 a 研​​究或类实例中删除样本的示例,

    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()
    

肯定有比使用字符串比较的双循环更优雅的方法吗? recompute 这里只是对“新”数据集再次进行降维等。同样强制 idxs 是一个列表对我来说似乎很奇怪。但另一方面,for item in itemList 不区分字符串或列表。 :/

  1. 有更好的方法吗?实用程序包中的其他一些数据类型或其他什么?因为name 是一个键,而我是根据值而不是键来删除样本,所以dicts 的效率似乎对我不利。

  2. 我的 MATLAB 实现很差,因为实现深拷贝非常费力;我通过使用第二个构造函数从 reduced 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 可以被认为是更新的,但我并没有觉得它太糟糕)。我的大部分数据不是稀疏的。他们对这方面的表现有什么建议吗?我主要做的是大型矩阵乘法、数值积分、微分等。


stackexchange 提醒我,是的,偏好是可以回答的问题;话虽如此,我并不是在寻找 a/the 答案。我是 Python 中的 OOP 新手,所以我只想覆盖这片土地,人们最喜欢解决此类问题的方法,指向我不知道此类东西的包的指针等。(哦......我 知道 pandas; 但我不喜欢它,它对我来说抽象了太多的内部结构,或者更确切地说......让我很难在紧要关头找到它们。)

【问题讨论】:

  • 承认你的问题是题外话并不会减少题外话。
  • 指出我必须问它的地方。 :)
  • 说真的,stackexchange 并没有告诉我我的问题是“题外话”,我只是指这个黄色框:ibb.co/b6gcYJ 但我相信这种恐惧是有道理的。
  • 如果这个问题是题外话,那么你可以在这里问的唯一问题是“请为我调试我的代码”?还剩下什么? IMO 这是一个比大多数问题更有趣的问题。
  • @Cris Luengo - 这篇文章会提出一系列很好的主题特定问题,它只是碰巧很大。此外,它的某些部分是主观的,我认为这有可能被标记为 SO。

标签: python matlab class oop large-data


【解决方案1】:

一个问题问的太多了,我认为是什么使它成为off-topic。我认为你可以通过拆分问题并切断主观部分来做得更好。第 3 部分特别令人沮丧。

不过是快速浏览:

  • python/pandas 不是 MATLAB 并且永远不会是,您不应期望它们提供会话功能或抱怨它不存在。这是设计使然,而不是缺陷。

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

  • 是否有新数据添加到您的数据集中或已修复?如果有一些新数据来了,你可能想要改变你的数据管道,也许考虑将它扁平化为 SQL 数据库,或者使用 NoSQL 数据库,它实际上与存储 dicts/json 相同,其他选项如下。

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

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

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

希望这不是说教!

【讨论】:

  • 感谢@Evgeny。我不知道:“默认行为首先创建一个未初始化的实例,然后恢复保存的属性。”谢谢你,我需要一些思考。至于 b1,我不喜欢 Pandas(是的,我可能不明白他们的哲学,但考虑我支持 CiC 的这个 - 不需要), b2:是的,这正是这个问题的重点。子弹3:是的,新数据是定期的,但我只能获得零星的访问(它经过大量的预处理)。 Cookiecutter 很诱人,但也让我想起:legacy.gitbook.com/book/svkucheryavski/mdatoolsm/details
  • 即它需要是最新的并定期更新。
  • 另外,为什么深拷贝问题没有动力去回答?答案是否太长,或者答案是否定的?即是的,我必须覆盖每个属性? ://
  • 深拷贝部分很好,但我对此没有意见。阅读关于您的代码很差的邀请只是压倒性的 - 然后它应该转到codereview.stackexchange.com
  • 什么是 CiC?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
  • 2012-07-15
  • 2017-11-11
  • 2023-03-21
  • 2019-05-27
相关资源
最近更新 更多