我正在处理跟踪本地比赛中网球运动员的跟踪数据。数据以 json 文件的形式提供给我,每 100 毫秒(即每秒 10 次),它知道球场两侧球员的位置以及球的位置,并提供其他比赛数据。使用这个跟踪数据,我创建了一堆自定义 python 类和子类来创建一个“匹配”对象,并将所有跟踪数据加载到这个“匹配对象”中。我可以创建一个 pandas df 来保存自定义类的实例吗/这有意义吗?
背景故事/思考过程(如果我的问题没有意义,这很有可能...)
我第一次实现它时,我基本上创建了一个“比赛”对象,我使用 python OOP 并将比赛分解为比赛、比赛、积分、球员等。球员部分有点困惑,因为计算最后,我们每 100 毫秒创建一个玩家对象和一个玩家的新实例(很难理解,因为一个玩家在整个游戏中都是相同的,但可以将其视为那个确切时刻的玩家)。我不确定将这些“玩家”对象改为 pandas 数据框中的行是否更有意义(它们有很多,想想 3 小时的比赛),或者我是否可以创建一个 pandas df 并让玩家成为专栏。玩家构成点,然后点构成帧,所以如果我确实将玩家对象更改为 pandas df,那将很难,因为我会在数据框中有一堆行构成一个点,然后是一堆点玩游戏..等等
因为有太多的跟踪数据,效率方面的考虑对我来说很重要(虽然我更喜欢做一些慢一点但不彻底的事情,但它有助于我确保/检查所有数据)
请您参考如下方法:
DataFrame 的列(系列)可以具有任何 NumPy 数据类型,包括 object,它可以容纳任意 Python 对象。
这样做首先放弃了使用 NumPy/Pandas 的大部分速度和空间优势。还有类型检查——如果您不小心插入了一个不是 match 子类实例的对象,它就会起作用。以及许多便利功能。
但您仍然可以获得一些便利的功能,有时这是使用 Pandas 的充分理由。
但是,如果性能 Not Acceptable ,您将不得不重新考虑事情。例如,如果您将对象展平为一组属性(对于某些子类,其中一些属性可能是 NaN 或 N/A),您可以将它们存储为一行,尤其是如果其中一些属性是 float 或整数之类的东西您想对其进行大量计算,您将从 Pandas 中获得更多 — 当然,代价是失去类的 OO 优势。
有时,值得构建一个混合体来获得两全其美:一个 DataFrame 的行保存您的 match 对象的存储,然后还有一个 match 类层次结构,它包含一个索引甚至一个单行数据帧(来自主数据帧的一个切片),并提供对相同信息的面向对象 View 。但更多时候,这样做是不值得的,因为要么几乎所有代码最终都变成了 Pandas,要么几乎所有代码最终都变成了 OO。
最后一种可能性,如果有大量这样的东西,将是使用关系数据库或老式层次数据库的 ORM,1 用于存储和索引。
<子>
1。事实上,从一堆
DataFrame 中构建一个分层数据库,然后将其包装在一个对象模型中,基本上与上一段相同,但这里的想法是你使用已经存在的东西构建是为了完成所有困难和/或乏味的事情,而不是你构建数据库只是为了对自己隐藏它。
子>
