3

これは次の質問とよく似ています:ネストされたリストの最小値、最大値、平均値を見つけていますか?

質問の重要な違いと根源は、一意の列名(人の名前)ごとに、リスト内(リスト内にネストされた)の最小値、最大値、平均値を見つけたいということです。

例: 各行は基本的に (同様の架空の名前で)-

epochtime, name, score, level, extralives 

例えば

    1234455, suzy, 120, 3, 0
    1234457, billy, 123, 1, 2
    1234459, billy, 124, 2, 4
    1234459, suzy, 224, 5, 4
    1234460, suzy, 301, 7, 1
    1234461, billy, 201, 3, 1

そして、これらは時間ごとにリストに配置されます。

if epochtime < 1234500 and epochtime > 1234400:
        timechunk1.append(line)

各時間チャンクを含むリストのリストがあります。

listoflists = [timechunk1, timechunk2....]

これは、この質問にとってやり過ぎ/無関係である場合とそうでない場合があります。

各フィールド (スコア、レベル、エクストラライブ) の最小値、最大値、平均値を一意の名前 (ビリーまたはスージー - ビリーまたはスージー以外にもたくさんあるので、リストしないほうがよいでしょう) を見つけるにはどうすればよいですか?個別に)各リスト(timechunk1、timechunk2)で?

4

2 に答える 2

2

名前ごと、フィールドごとのリストを収集する必要があります。

ファクトリを使用collections.defaultdictしてネストされたリストを作成します。

from collections import defaultdict

columns = ('score', 'level', 'extralives')

def per_user_data():
    return {k: [] for k in columns}

stats_per_timechunk = []

for timechunk in listoflists:
    # group data per user, per column (user -> {c1: [], c2: [], c3: []})
    data = defaultdict(per_user_data)    
    for userdata in timechunk:
        per_user = data[userdata[1]]
        for column, value in zip(columns, userdata[2:]):
            per_user[column].append(value)

    # collect min, max and average stats per user, per column 
    # (user -> {c1: {min: 0, max: 0, avg: 0}, ..})
    stats = {}

    for user, per_user in data.iteritems():
        stats[user] = {column: {
                'min': min(per_user[column]),
                'max': max(per_user[column]),
                'avg': sum(per_user[column]) / float(len(per_user[column])),
            } for column in columns}

    stats_per_timechunk.append(stats)

サンプルの入力データを 1 つのタイムチャンクにダンプすると、次のようになります。

>>> pprint(stats_per_timechunk)
[{'billy': {'extralives': {'avg': 2.3333333333333335, 'max': 4, 'min': 1},
            'level': {'avg': 2.0, 'max': 3, 'min': 1},
            'score': {'avg': 149.33333333333334, 'max': 201, 'min': 123}},
  'suzy': {'extralives': {'avg': 1.6666666666666667, 'max': 4, 'min': 0},
           'level': {'avg': 5.0, 'max': 7, 'min': 3},
           'score': {'avg': 215.0, 'max': 301, 'min': 120}}}]

おそらく、これらすべてのリストの代わりに別のデータ構造を使用することを検討するか、データをより効率的に分析するためにpandasのようなものを使用する必要があります。

于 2013-04-16T13:56:19.710 に答える