4

我有一个脚本,可以将系统日志文件读入 pandas 数据帧并从中生成图表。这些图表适用于小型数据集。但是当我面对更大的数据集时,由于数据收集的时间范围更大,图表变得太拥挤而无法辨别。

我计划重新采样数据框,以便如果数据集通过一定大小,我将重新采样它,因此最终只有 SIZE_LIMIT 行数。这意味着我需要过滤数据帧,以便每个 n = actual_size/SIZE_LIMIT 行都会聚合到新数据帧中的一行。聚合可以是平均值,也可以是第 n 行。

我对熊猫并不完全精通,所以可能错过了一些明显的手段。

4

2 回答 2

13

实际上我认为您不应该修改数据本身,而是要查看所需间隔内的数据进行绘图。该视图将是要绘制的实际数据点。

例如,对于计算机屏幕,一种简单的方法是计算区间中有多少点,以及有多少像素可用。因此,为了在 1000 像素宽度的窗口中绘制一个具有 10000 个点的数据帧,您可以使用以下语法获取一个步长为 10 的切片(对于示例来说,whole_data 将是一个一维数组):

data_to_plot = whole_data[::10]

这可能会产生不良影响,特别是掩盖可能从切片操作中“逃脱不可见”的短峰。另一种方法是将您的数据拆分为箱,然后为每个箱计算一个数据点(例如最大值)。由于 numpy/pandas 高效的数组操作,我觉得这些操作实际上可能很快。

希望这可以帮助!

于 2013-01-29T19:38:42.760 回答
5

您可以使用pandas.qcut索引上的方法将索引分成相等的分位数。您传递给的值qcut可能是actual_size/SIZE_LIMIT.

In [1]: from pandas import *

In [2]: df = DataFrame({'a':range(10000)})

In [3]: df.head()

Out[3]:
   a
0  0
1  1
2  2
3  3
4  4

在这里,按索引对索引进行分组会qcut(df.index,5)产生 5 个同样分箱的组。然后我取每组的平均值。

In [4]: df.groupby(qcut(df.index,5)).mean()

Out[4]:
                       a
[0, 1999.8]        999.5
(1999.8, 3999.6]  2999.5
(3999.6, 5999.4]  4999.5
(5999.4, 7999.2]  6999.5
(7999.2, 9999]    8999.5
于 2013-01-29T20:35:41.110 回答