2016-04-13 7 views
0

print (data_Week) gibt mir zu bekommen:schnellste Weg Mittelwert aus Wörterbuch

{'2016-04-09 00:56': ['12.0', '50.7'], '2016-04-08 05:23': ['15.4', '49.8'], '2016-04-....} 

Die Werte sind Temperature und Humidity Werte.

Ich möchte die average Werte aus dem Wörterbuch data_Week erhalten.

Die Methode, die ich bin Werke verwenden, aber es dauert ewig auf meinem Raspberry Pi ....

for date,value in data_Week.items(): 
    temp_first_value_Week = float(value[0]) 
    temp_total_Week += temp_first_value_Week 
    temp_length_Week += 1 
    hum_first_value_Week = float(value[1]) 
    hum_total_Week += hum_first_value_Week 
    hum_length_Week += 1 
if temp_length_Week > 1: 
    tempAverage_Week = temp_total_Week/temp_length_Week 
    tempAverage_Week = "%.2f" % tempAverage_Week 
tempAverage_Week = str(tempAverage_Week)+'\xb0C' 
if hum_length_Week > 1: 
    humAverage_Week = hum_total_Week/hum_length_Week 
    humAverage_Week = "%.2f" % humAverage_Week 
humAverage_Week = str(humAverage_Week)+'%' 

dort jede Minute ein Wörterbucheintrag ist und ich versuche, von einer Woche Durchschnittswert zu erhalten. So gibt es 1440 Temperaturwerte und 1440 Luftfeuchtigkeitswerte pro Tag ..... 10080 Werte pro Woche. Gibt es eine kluge Möglichkeit, die Durchschnittswerte zu erhalten. Das Verfahren von oben nimmt das pi um 15 minutes

Edit: Ich fand heraus, dass das Skript so lange gedauert habe, weil ich über das Wörterbuch geschlungen, die als BHawk in seinem post erwähnte nicht notwendig war.

Ich werde die One Liner von John Coleman verwenden. Es funktioniert perfekt. Und danke für die Pandas approach. Vielleicht, wenn die aktuelle Version wieder langsamer wird, werde ich darauf wechseln. Danke für die Hilfe.

+1

Ich weiß nicht, aber ich bezweifle, Ihr Raspberry Pi nur 11 dict Einträge pro Sekunde verarbeiten würde. Vielleicht enthält das Diktat mehr Daten als Sie denken, oder die Ineffizienz ist an einem anderen Ort, oder die Box ist beschäftigt? – Norman

+0

Ich begann mit der Protokollierung von Daten und um 19.00 Uhr erhalte ich eine E-Mail vom PI mit den Werten "max", "min" und "average" über einen Zeitraum von 7 Tagen. Beim Start der Protokollierung hatte die erste Mail nur Werte von ca. 14 Stunden, und nach ein paar Tagen der Protokollierung verlangsamt es ... jetzt, da es immer einen Zeitraum von 7 Tagen in der Protokolldatei gibt, dauert es fast immer so viel Zeit ... das Problem könnte sein, dass ich nicht nur Durchschnitt für eine Woche, aber auch für die letzten 24 Stunden .... –

+1

Wenn Ihre Berechnungen jemals zu langsam werden, kann ein effizienter Ansatz der Einsatz eines "Online" -Algorithmus sein, der Ihre Ergebnisse inkrementell aktualisiert, sobald ein neuer Datenpunkt eintrifft. Für die Berechnung von min, max, [durchschnittlich] (https://en.wikipedia.org/wiki/Algorithmen_für_Kalkulationsvarianz#Online_Algorithmus), das ist einfach zu tun und verteilt den Berechnungsaufwand so stark, dass er unbemerkbar wird. – Norman

Antwort

1

Sie brauchen nicht die Anzahl der Einträge jedes Mal, wenn Sie einen Wert lesen zu erhöhen . Sie müssen beim Lesen der Werte keine Float-Umwandlung durchführen.

Versuche:

week_length = len(data_Week.keys()) 
if week_length > 1: 
    tempAverage_Week = sum([x for x,y in data_Week.values()])/weekLength 
    humAverage_Week = sum([y for x,y in data_Week.values()])/weekLength 
+0

Nun, in der Frage sind die Werte nicht bereits schwebt. Außerdem sollte die erste Zeile 'week_length = len (data_Week)' sein. – Norman

2

Vielleicht bin ich etwas fehlt, aber wenn alles, was Sie den Durchschnitt der Temperaturen wollen, ist dann eine 1-Line-Lösung sollte möglich sein und schnell laufen sollte:

>>> d = {'2016-04-09 00:56': ['12.0', '50.7'], '2016-04-08 05:23': ['15.4', '49.8']} 
>>> sum(float(x) for x,y in d.values())/len(d) 
13.7 
+0

Danke, ich versuche derzeit Ihre Version auf meinem Laptop ... –

2

Haben Sie versucht, Pandas? Ich denke, es könnte besser für dieses Volumen und die Art von Daten/Operationen, die Sie tun, leistungsfähiger sein. Zum Beispiel, sparte ich Ihnen Beispieldaten in einer JSON-Datei und lief das folgende Skript:

import pandas as pd 

with open("data.json", "r") as handle: 
    x = pd.read_json(handle, orient='index') 

print("Data:") 
print(x) 
print("Description:") 
print(x.describe()) # Will print a summary of each column 

Ergebnis

Data: 
         0  1 
2016-04-08 05:23:00 15.4 49.8 
2016-04-09 00:56:00 12.0 50.7 
Description: 
       0   1 
count 2.000000 2.000000 
mean 13.700000 50.250000 
std  2.404163 0.636396 
min 12.000000 49.800000 
25% 12.850000 50.025000 
50% 13.700000 50.250000 
75% 14.550000 50.475000 
max 15.400000 50.700000 
+3

Pandas ist definitiv eine natürliche Wahl für diese Art von Problem, obwohl die Notwendigkeit, auf einem Raspberry Pi zu laufen, Beschränkungen für die Größe der Bibliotheken, die in verwendet werden können die Lösung. –