2017-03-22 5 views
1

Ich verwende Python, um eine große Menge von CSV-Daten zu analysieren. Diese Daten enthalten vier verschiedene Arten von Metriken für ein bestimmtes Zeitstempel- und Hostpaar, wobei der Metriktyp im ersten Feld jeder Zeile angegeben ist. Hier ist ein vereinfachtes Beispiel:Implizit entscheiden, welches Wörterbuch verwendet werden soll

metric,timestamp,hostname,value 
metric1,1488063747,example01.net,12 
metric2,1488063747,example01.net,23 
metric3,1488063747,example01.net,34 
metric4,1488063747,example01.net,45 
metric1,1488063788,example02.net,56 
metric2,1488063788,example02.net,67 
metric3,1488063788,example02.net,78 
metric4,1488063788,example02.net,89 

Also, für jede row (eigentlich eine Liste innerhalb einer Liste von Listen) ich einen Index des Zeitstempels und die Hostnamen zusammengesetzt machen:

idx = row[1] + ',' + row[2] 

Jetzt, basierend auf der Inhalt des ersten Feldes (Listenelement), mache ich etwas wie:

if row[0] == 'metric1': metric_dict[idx] = row[3] 

Ich mache das für jede der 4 Metriken. Es funktioniert, aber es scheint, als sollte es einen besseren Weg geben. Es scheint, als ob ich irgendwie implizit oder indirekt das zu verwendende Wörterbuch basierend auf dem Inhalt von Zeile [0] auswählen muss, aber meine Suchen haben kein Ergebnis ergeben. In diesem Fall sind 4 if Zeilen nicht schwierig, aber es wäre nicht ungewöhnlich, dass mehr metrische Typen in einer Datei enthalten sind. Ist es möglich, dies zu tun und bleiben Sie mit, wie viele Wörterbücher benötigt werden, nachdem die Liste der Listen gelesen wird? Vielen Dank.

+2

Sie könnten Nest diese dicts in * anderen * dict, sagen 'metrics', wo die Schlüssel sind'“ metric1 "', und die Werte sind das passende dict, also, metric [row [0]] [idx] 'ist das, was du am Ende benutzen würdest. –

Antwort

0

Problem: nicht genug dicts.

Lösung:

conversion_dict = {'metric1': metric1_dict, 'metric2': metric2_dict} 

for row: 
    conversion_dict[row[0]][idx] = row[3] 
0

Warum nicht so etwas wie

output = {} 
for row in rows: 
    # assuming this data is already split 

    if not row[0] in output: 
     output[row[0]] = {} 
    idx = row[1] + ',' + row[2] 
    output[row[0]][idx] = row[3] 
0

Wenn Sie eine Menge von Tabellen Manipulation tun, Sie die pandas Bibliothek nützlich finden. Wenn ich richtig verstehe, was Sie zu tun versuchen:

import pandas as pd 
from StringIO import StringIO 

s = StringIO("""metric,timestamp,hostname,value 
metric1,1488063747,example01.net,12 
metric2,1488063747,example01.net,23 
metric3,1488063747,example01.net,34 
metric4,1488063747,example01.net,45 
metric1,1488063788,example02.net,56 
metric2,1488063788,example02.net,67 
metric3,1488063788,example02.net,78 
metric4,1488063788,example02.net,89 
""") 

df = pd.read_csv(s) 
df.pivot(index="timestamp", columns='metric',values='value') 

Dies ergibt:

metric  metric1 metric2 metric3 metric4 
timestamp          
1488063747  12  23  34  45 
1488063788  56  67  78  89 
Verwandte Themen