提问者:小点点

在python中处理大型多维时间序列数据的最有效方法[关闭]


想改进这个问题吗?更新问题,以便通过编辑这篇文章用事实和引用来回答。

我正在为一个视频游戏提供统计服务,在这个游戏中,我每小时挖掘一次该游戏的排行榜,并创建图表等来跟踪玩家的进度。最初,我使用了一个MultiIndex DataFrame,它看起来类似于:

import pandas as pd
import numpy as np
index_arrays = [np.array(["01.01.22"]*4+["02.01.22"]*4), 
                np.array(["Name","Level","Money","Guild"]*2)]

df = pd.DataFrame([["a","b","c"],[4,5,6],[7,8,9],
                   [10,11,12],["a","b","d"],[16,1,17],
                   [18,19,20],[21,22,23]], index=index_arrays, columns=["1","2","3"])

输出:

                 1   2   3
01.01.22 Name    a   b   c
         Level   4   5   6
         Money   7   8   9
         Guild  10  11  12
02.01.22 Name    a   b   d
         Level  16   1  17
         Money  18  19  20
         Guild  21  22  23

该结构基于排行榜的挖掘方式(列代表排名)。更新此DataFrame后,它一直保存为. csv文件。

然而,大约一年后,遍历此DataFrame并收集特定播放器的数据(既不容易通过列也不容易通过索引过滤)变得非常缓慢。这是通过以更面向玩家的方式重新组织数据来解决的。每个玩家都有自己的. csv文件(=

          Level  Money  Guild
01.01.22      4      7     10
02.01.22     16     18     21

目前这是可行的,但我正在考虑什么是最有效的方法来继续这样做,无论是从访问数据的速度还是存储空间的角度来看。我正在考虑从. csv存储切换到SQL的解决方案。这是更快还是需要更少的磁盘空间?我可以在一个数据库文件中使用许多表,而不是有许多.csv文件。我在股票数据的上下文中看到的另一个选项是一个大数据库,其中每一行将在某个时间显示一个玩家的条目。它看起来像这样,加起来有数百万行。

  Name  Rank  Level  Money  Guild      Date
0    a     1      4      7     10  01.01.22
1    b     2      5      8     11  01.01.22
2    c     3      6      9     12  01.01.22
3    a     1     16     18     21  02.01.22
4    b     2      1     19     22  02.01.22
5    d     3     17     20     23  02.01.22

我意识到这个问题可能类似于收集历史股市数据,其中一个人拥有数百只股票的几个属性(价格,交易量,…)的时间序列数据。所以我确信有些人已经找到了解决这种问题的最优雅和快速的解决方案。你们中有人有这方面的经验吗,甚至可能测量一些基准?


共2个答案

匿名用户

在存储方面,一些其他文件类型对数据帧存储有效,也有助于大大提高解析大型数据集的速度(例如csv慢)

  1. 羽毛适合短期存储和保持数据类型和快速读取。我们将其用作数据缓存的形式,其中我们可能有SQL数据库,用于存储和帮助有效查询,然后通过羽毛文件缓存该数据帧
  2. 镶木地板有利于更长期的存储。link很好地解释了两者的区别
  3. hdf5另一种不错的文件格式(链接中的更多解释

这些只是几个,但希望能对不同的文件类型进行一些很好的介绍,因为获取更大的数据集会发现csv有点慢。一些性能差异的示例帖子(针对csv显示)参见链接

上面的任何进一步查询都意味着需要将内存中的整个文件读取到数据帧中,然后过滤/查询/等。如果数据集变大,需要持久性,希望能够查询到较小的数据集,熊猫可以使用这个不错的解决方案(SQL很好,因为可以强制执行不同的数据展示一致性,类型等)。现在SQL读取数据帧时通常比feather/etc慢,但是如果查询得到的数据足够小,也许这对你来说可以忽略不计

匿名用户

你可以考虑极地。它比熊猫快几个数量级。我建议将您的数据存储在二进制格式中,例如parquet或箭头ipc格式(feather)。

如果您写入parquet,我们甚至可以在您的查询中使用统计信息,这可能会提高您的查询性能。