2016-11-07 6 views
1

I AWS EC2-Instanz CPU-Auslastung und andere metrische Daten haben mich im CSV-Format wie folgt angegeben:Agglomerat Zeitreihendaten

Date,Time,CPU_Utilization,Unit 
2016-10-17,09:25:00,22.5,Percent 
2016-10-17,09:30:00,6.534,Percent 
2016-10-17,09:35:00,19.256,Percent 
2016-10-17,09:40:00,43.032,Percent 
2016-10-17,09:45:00,58.954,Percent 
2016-10-17,09:50:00,56.628,Percent 
2016-10-17,09:55:00,25.866,Percent 
2016-10-17,10:00:00,17.742,Percent 
2016-10-17,10:05:00,34.22,Percent 
2016-10-17,10:10:00,26.07,Percent 
2016-10-17,10:15:00,20.066,Percent 
2016-10-17,10:20:00,15.466,Percent 
2016-10-17,10:25:00,16.2,Percent 
2016-10-17,10:30:00,14.27,Percent 
2016-10-17,10:35:00,5.666,Percent 
2016-10-17,10:40:00,4.534,Percent 
2016-10-17,10:45:00,4.6,Percent 
2016-10-17,10:50:00,4.266,Percent 
2016-10-17,10:55:00,4.2,Percent 
2016-10-17,11:00:00,4.334,Percent 
2016-10-17,11:05:00,4.334,Percent 
2016-10-17,11:10:00,4.532,Percent 
2016-10-17,11:15:00,4.266,Percent 
2016-10-17,11:20:00,4.266,Percent 
2016-10-17,11:25:00,4.334,Percent 

Wie ersichtlich, dies wird alle 5 Minuten gemeldet. Ich habe keinen Zugang zum aws-cli. Ich muss dies verarbeiten und die durchschnittliche Auslastung alle 15 Minuten für die Visualisierung melden. Das heißt, für jede Stunde muss ich den Durchschnitt der Werte in den ersten 15 Minuten, den nächsten fünfzehn Minuten usw. finden. Also werde ich jede Stunde 4 Werte melden.

würde eine Probe ausgegeben werden:

Date,Time,CPU_Utilization,Unit 
2016-10-17,09:30:00,14.517,Percent 
2016-10-17,09:45:00,40.414,Percent 
2016-10-17,10:00:00,33.412,Percent 
2016-10-17,10:15:00,26.785,Percent 
... 

Eine Möglichkeit, es zu tun, würde die gesamte Datei zu lesen seine Zeile (die 10000 + hat), dann für jeden Tag, um die Werte finden, die zu einem Fenster gehören von 15 Minuten, berechnen Sie ihren Durchschnitt und wiederholen Sie für alle Werte. Dies scheint nicht der beste und effizienteste Ansatz zu sein. Gibt es einen besseren Weg, es zu tun? Vielen Dank.

+0

Ist die Datei wirklich zu groß, um sie vollständig einzulesen? 10000 Zeilen klingen nicht zu groß, um sie in einem 'numpy' Array zu lesen und dort zu verarbeiten. Ich denke, das sollte besser funktionieren, als die Datei zu durchlaufen und Zeile für Zeile zu lesen. – jotasi

+0

@jotasi Nein, es ist nicht groß. Selbst ich dachte über den Ansatz nach, die gesamte Datei als Numpy-Array zu lesen. Wie würde ich dann weitermachen? Soll ich dann die zu einem bestimmten Datum gehörenden Zeilen lesen und dann fortfahren? Jede Hilfe wäre willkommen. – theironhide

+0

Pandas ist gemacht, um so etwas zu tun. –

Antwort

1

Da Ihre Eingabedaten eigentlich ziemlich klein sind, würde ich vorschlagen, sie sofort mit np.genfromtxt einzulesen. Dann können Sie den geeigneten Bereich finden, indem Sie prüfen, wann eine volle Viertelstunde erreicht ist, und mit dem Zählen beenden, wie viele volle Quartale noch übrig sind. Dann können Sie np.reshape verwenden Sie das Array in eine Form mit Reihen von viertel Stunden zu bekommen und dann Durchschnitt über diese Zeilen:

import numpy as np 

# Read in the data: 
data = np.genfromtxt("data.dat", skip_header=1, 
        dtype=[("date", "|S10"), 
          ("time", "|S8"), 
          ("cpu_usage", "f8")], 
        delimiter=',', usecols=(0, 1, 2)) 

# Find the first full quarter: 
firstQuarterHour = 0 
while not (int(data[firstQuarterHour]["time"][3:5]) % 15 == 0): 
    firstQuarterHour += 1 
noOfQuarterHours = data[firstQuarterHour:].shape[0]/3 

# Create a reshaped array 
reshaped = data[firstQuarterHour:firstQuarterHour+3*noOfQuarterHours+1].reshape(
    (noOfQuarterHours, 3)) 

# Average over cpu_usage and take the appropriate dates and times: 
cpu_usage = reshaped["cpu_usage"].mean(axis=1) 
dates = reshaped["date"][:, 0] 
times = reshaped["time"][:, 0] 

Jetzt können Sie diese Felder verwenden, um zum Beispiel in einer anderen Textdatei speichern unter Verwendung np.savetxt .