4

システム ログ ファイルを pandas データフレームに読み込み、それらからグラフを生成するスクリプトがあります。グラフは小さなデータ セットに適しています。しかし、データ収集の時間枠が長くなり、より大きなデータ セットに直面すると、グラフが混み合って識別できなくなります。

データフレームをリサンプリングして、データセットが特定のサイズを超えた場合にリサンプリングして、最終的に SIZE_LIMIT 行数だけになるようにする予定です。これは、データフレームをフィルタリングして、n = actual_size/SIZE_LIMIT 行ごとに新しいデータフレームの単一行に集約する必要があることを意味します。集計は、平均値またはそのまま取得された n 番目の行のいずれかです。

私はパンダに完全に精通しているわけではないので、いくつかの明らかな手段を見逃している可能性があります。

4

2 に答える 2

13

実際には、データ自体を変更するのではなく、プロットする目的の間隔でデータを表示する必要があると思います。このビューは、プロットされる実際のデータポイントになります。

単純なアプローチは、たとえば、コンピュータ画面の場合、間隔内にあるポイントの数と、使用可能なピクセルの数を計算することです。したがって、1000ピクセル幅のウィンドウに10000ポイントのデータフレームをプロットするには、次の構文を使用して、STEPが10のスライスを取得します(例として、whole_dataは1D配列になります)。

data_to_plot = whole_data[::10]

これは、特に、スライス操作から「見えないように逃げる」可能性のある短いピークをマスクするなど、望ましくない影響を与える可能性があります。別の方法は、データをビンに分割してから、ビンごとに1つのデータポイント(たとえば、最大値)を計算することです。numpy / pandasの効率的な配列操作により、これらの操作は実際には高速であると思います。

お役に立てれば!

于 2013-01-29T19:38:42.760 に答える
5

インデックスに対してメソッドを使用してpandas.qcut、インデックスを等しい分位数に分割できます。渡す値qcutactual_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 に答える