5

次のような 3 列の csv ファイルを使用しています。

timeStamp, value, label
15:22:57, 849, CPU pid=26298:percent
15:22:57, 461000, JMX MB
15:22:58, 28683, Disks I/O
15:22:58, 3369078, Memory pid=26298:unit=mb:resident
15:22:58, 0, JMX 31690:gc-time
15:22:58, 0, CPU pid=26298:percent
15:22:58, 503000, JMX MB

label列には、スペース、コロン、その他の特殊文字を含む個別の値 (合計 5 など) が含まれます。

私が達成しようとしているのは、各メトリックに対して時間をプロットすることです (同じプロットまたは別のプロットのいずれか)。でこれを行うことができますが、最初に「ラベル」に従ってペアmatplotlibをグループ化する必要があります。[timeStamps, value]

csv.DictReaderラベルを取得し、「ラベル」でグループ化する方法を調べましたitertools.groupbyが、適切な「Pythonic」の方法でこれを行うのに苦労しています。

なにか提案を?

4

3 に答える 3

6

必要ありませんgroupby; ラベルでキー付けされたcollections.defaultdict一連のペアを収集するために使用したい:[timestamp, value]

from collections import defaultdict
import csv

per_label = defaultdict(list)

with open(inputfilename, 'rb') as inputfile:
    reader = csv.reader(inputfile)
    next(reader, None)  # skip the header row

    for timestamp, value, label in reader:
        per_label[label.strip()].append([timestamp.strip(), float(value)])

現在per_labelは、ラベルをキーとして、[timestamp, value]ペアのリストを値として持つ辞書です。空白を取り除き (入力サンプルには余分な空白がたくさんあります)、value列を float に変えました。

結果が得られる(限定された)入力サンプルの場合:

{'CPU pid=26298:percent': [['15:22:57', 849.0], ['15:22:58', 0.0]],
 'Disks I/O': [['15:22:58', 28683.0]],
 'JMX 31690:gc-time': [['15:22:58', 0.0]],
 'JMX MB': [['15:22:57', 461000.0], ['15:22:58', 503000.0]],
 'Memory pid=26298:unit=mb:resident': [['15:22:58', 3369078.0]]}
于 2013-04-25T09:33:19.940 に答える
2

使用できますnumpy.loadtxt

import numpy as np
result = np.loadtxt('MYFILE', usecols=(0, 1, 2), 
          dtype=[('time', 'S8'), ('values', np.uint), ('label', 'S33')], 
          delimiter=', ')

これにより、テーブルが構造化配列にロードされます。ここで、時間は 8 文字の文字列 ('S8')、値は符号なし整数、ラベルは最大 33 文字の文字列 ('S33'、調整する必要がある場合があります) として保存されます。このサイズ)。次に、タイプ別に値にインデックスを付けることができます。

>>> print result['values']
[    849  461000   28683 3369078       0       0  503000]

必要に応じて、ラベルに従ってフィルタリングします。

>>> print result['values'][result['label'] == 'JMX MB']
[461000 503000]

時刻を文字列から浮動小数点数に変換するには、pylabの日付datestr2numを使用して、コンバーターとして次のように指定できますloadtxt

import pylab
result = np.loadtxt('MYFILE', usecols=(0, 1, 2), 
           dtype=[('time', np.float), ('values', np.uint), ('label', 'S33')],
           delimiter=', ', converters={0: pylab.datestr2num})
于 2013-04-25T09:32:59.003 に答える