2016-03-25 17 views
1

Ich habe ein Experiment durchgeführt, bei dem mehrere Umfrageteilnehmer mehrere Musikstücke mit Wearable-Technologie angehört haben, um mehrere Informationen zu verfolgen, zwei Beispiele sind BPM (Herzfrequenz) und T (Körpertemperatur).Python Pandas: Speichern Sie mehrere Zeitreihen variabler Länge für mehrere Attribute für mehrere Benutzer

Das Ziel ist es, den Einfluss jedes Musikstücks (gekennzeichnet durch Benutzer-Feedback) auf menschliche Emotionen zu messen.

Im Moment alle Daten in .txt Dateien gespeichert wurden (Jede Zeile in einer Textdatei einen Eintrag hat) in mehreren Verzeichnissen, die die folgende Struktur haben:

/user_1 
    /BPM 
     song_1.txt 
      76 
      78 
     song_2.txt 
      76 
      78 
      85 
    /T 
     song_1.txt 
      35.7 
      35.3 
      35.3 
      35.3 
      35.3 
     song_2.txt 
      32.2 
      32.4 
      37.8 
      32.4 
      37.8 

Jede einzelne .txt Datei haben kann eine andere Länge, aufgrund von Variablen wie Liedlänge und der Inkonsistenz in der Zeitperiode für das tragbare Gerät, das sendet. Zum Beispiel können selbst für dasselbe Lied die Zeitserien für BPM und T unterschiedliche Längen haben.

Ich habe bereits geschrieben Python-Code zu durchlaufen und lesen Sie die Werte aus allen Dateien.

Im Moment Ich erwäge einen Datenrahmen wie die folgende erstellen:

User_ID Song_ID BPM  T 
1  1  [65,...] [36,...] 
1  2  [65,...] [36,...] 
2  1  [65,...] [36,...] 
2  2  [65,...] [36,...] 

Aber ich mache mir Sorgen, ein Array in jeder Zelle zu speichern könnten Aufgaben machen die Daten wie die Standardisierung schwierig - ich frage mich, ob ich jetzt da ist eine bessere Möglichkeit, MultiIndex zu nutzen, um dieses in Pandas zu speichern?

+1

Haben Sie die Bibliothek 'xarray' angeschaut? Es ist für die wissenschaftliche Datenanalyse konzipiert und erweitert Pandas auf mehrdimensionale Arrays. –

+0

Die Bibliothek sieht gut aus, können Sie weitere Ratschläge zu diesem speziellen Anwendungsfall geben? – jfive

Antwort

1

Ich denke, es wird einfacher sein, mit dicts von Datenrahmen zu arbeiten. Listen in Zellen zu haben erfordert eine Menge zusätzlichen Aufwand, der in Ihrem Fall vermieden werden kann.

Ich denke, dass die nützlichste Datenstruktur für Ihren Fall einen Datenrahmen zu haben wäre für jeden song_id. Obwohl die Daten, die Sie für jeden Benutzer haben, leicht unterschiedlich sein werden, können Sie immer noch mit einigen NaN s umgehen. Ihre Daten sind TimeSeries, daher sollten Sie Zeit als Achse haben. Höchstwahrscheinlich wollen Sie nicht die genaue Zeit haben, sondern die Anzahl der Sekunden seit Beginn des Songs.

Beispiel Struktur:

TimeStamp BPM_user1 BPM_user2 
1  65  34 
2  64  35 
3  66  39 
4  69  40 

Alternativ Sie einen Mehrspaltenindex verwenden könnten (mit dem Metric auf Stufe 0 und die userid auf Stufe 1)

Beispiel:

  BPM   T 
TimeStamp user1 user2 user1 user2 
1  65  80  34  38 
2  64  78  35  37 
3  66  77  39  37 
4  69  76  40  37 

Wenn Sie viele Metriken spezifische Transformationen haben, diese Sekunde Ansatz ist besser

Dann würden Sie einen dict verwenden alle Datenrahmen zu halten:

df_dict = { 
    'song1': read_df(song_id=1), 
    'song2': read_df(song_id=2), 
} 

die Sie dann einfach Ihre Analyse Performa laufen kann:

for songid, df in df_dict.items(): 
     *do analysis* 

Diese worklfow ist in der Regel einfacher und weniger fehleranfällig als mit pd.Panel

+0

Das ist wirklich gut durchdacht, vielen Dank! – jfive

Verwandte Themen