我可以创建一个 Pandas DataFrame 来保存自定义类实例吗?

6
我正在处理跟踪网球比赛中选手的数据。这些数据以json文件的形式提供给我,每100毫秒(即每秒10次),它会了解球场两侧的选手和球的位置,并提供其他比赛数据。使用这些跟踪数据,我创建了许多定制的python类和子类来创建“比赛”对象,并将所有跟踪数据加载到此“比赛对象”中。我能创建一个pandas df来保存自定义类的实例吗?这样做是否有意义?
背景/思路(以防我的问题不太清楚,这很有可能...)
第一次实现时,我基本上创建了一个“比赛”对象,其中使用了python面向对象编程(OOP),并将比赛分成游戏、盘、分、选手等部分。选手部分有点令人困惑,因为由于我这边的计算,我们在每100毫秒内创建了一个选手对象和一个新的选手实例(很难理解,因为一个选手在整个比赛中是相同的,但是可以把它想象成那个精确时刻的选手)。我不确定将这些“玩家”对象改变为pandas dataframe中的行是否更加合理(它们很多,考虑一场3小时的比赛),或者是否可以创建一个pandas df并将玩家设置为一列。选手组成了得分,然后得分组成了盘数,因此,如果我将玩家对象更改为pandas df,则会很困难,因为然后数据框中会有许多行组成一个得分,进而得分又组成了一局等等。
由于有很多跟踪数据,所以效率考虑对我很重要(尽管我倾向于做一些稍微慢一些但不是极端慢的事情,但它可以帮助我确保/检查所有数据)。
1个回答

13

DataFrame(数据帧)的列(Series)可以具有任何NumPy数据类型,包括object,它可以保存任意Python对象。

这样做放弃了使用NumPy/Pandas时的大部分速度和空间优势,还放弃了类型检查。如果不小心插入一个不是match子类实例的对象,它将仍然起作用,同时也失去了许多方便的特性。

但您仍然可以获得一些方便的特性,有时候这已经足够使用Pandas的理由。

如果性能不可接受,那么您需要重新考虑。例如,如果您将对象展平为一组属性(可能其中一些对于某些子类是NaN或N/A),您可以将其存储为一行,特别是如果其中一些属性是浮点数或整数,您需要对其进行大量计算,您将从Pandas中获得更多好处,但当然会损失您的类的面向对象(OO)优势。

偶尔地,值得构建混合体以获得两全其美的效果:一个DataFrame存储着你的match对象的存储,但同时还有一个match类层次结构,它持有索引甚至是一个单行DataFrame(主要的切片)并提供了对同一信息的面向对象视图。但更常见的是,这样做并不值得,因为您的代码几乎全部是Pandas或全部都是OO。

如果有大量这些东西,最后一种可能是使用关系数据库或老式分层数据库1作为存储和索引的ORM。


1. 实际上,将一堆DataFrame构建成分层数据库,然后将其包装在对象模型中基本上与前一段相同,但这里的想法是使用已经构建好的东西来完成所有难以或繁琐的工作,而不是为了将其隐藏起来而构建数据库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接