我有一个脚本将系统日志文件读入pandas数据帧并从中生成图表。这些图表适用于小型数据集。但是当我由于数据采集时间较长而面临更大的数据集时,图表变得过于拥挤而无法辨别。
我打算重新采样数据帧,这样如果数据集通过了一定的大小,我会重新采样,所以最终只有SIZE_LIMIT行数。这意味着我需要过滤数据帧,以便每个n = actual_size / SIZE_LIMIT行聚合到新数据帧中的单个行。 agregation可以是平均值,也可以是第n行。
我并不完全熟悉大熊猫,所以可能错过了一些明显的手段。
答案 0 :(得分:12)
实际上我认为你不应该修改数据本身,而是要在所需的时间间隔内查看数据。该视图将是要绘制的实际数据点。
例如,对于计算机屏幕,一种天真的方法是计算您的间隔中有多少个点,以及您可用的像素数。因此,为了在1000像素宽度的窗口中绘制10000点的数据帧,您可以使用此语法获取STEP为10的切片(whole_data仅为示例的1D数组):
data_to_plot = whole_data[::10]
这可能会产生不良影响,特别是掩盖可能从切片操作中“逃避”的短峰。另一种方法是将数据拆分为箱,然后为每个箱计算一个数据点(例如,最大值)。我觉得由于numpy / pandas高效的数组操作,这些操作实际上可能很快。
希望这有帮助!
答案 1 :(得分: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