2017-01-31 7 views
0

Ich bin ein Forscher, der Tierverhalten studiert, und ich versuche herauszufinden, wie ich meine Daten am besten strukturiere. Ich präsentiere Tieren kurze Musikstücke und zeichne ihre Reaktionen auf.Datenbankdesign für komplexe Musikanalyse

Die Daten

tune Jede besteht aus 1-10 Notizen von großen + Moll-Tonleitern über mehrere Oktaven zufällig ausgewählt. Jede Note wird für eine festgelegte Dauer gespielt, aber innerhalb eines kurzen Zeitfensters zufällig gespielt.

Ich notiere dann die binäre Antwort des Tieres auf die Melodie (Like/Abneigung).

Ich spiele täglich> 500 Melodien für das Tier, für> 300 Tage. Ich kombiniere auch Daten von> 10 Tieren.

Ich muss auch Variablen wie Trial Nummer an jedem Tag (war es die erste Melodie präsentiert? Letzte? Usw.), und Datum, so dass ich weiß, welche Daten aufgrund externer Probleme auszuschließen (zB Tier gestoppt Antworten nach 100 Versuchen oder für den ganzen Tag).

Die Analyse

Ich versuche, welche Arten von musikalischer Struktur in diesen zufällig erzeugten Melodien Gleichen führen/Abneigungen von dem Tiere zu entdecken. Ich mache das auf der Grundlage früherer Forschungsergebnisse überwiegend auf Hypothesenbasis. Die Abfragen, die ich in meinem Dataset ausführen muss, haben die Form: "Erhöht das Hinzufügen von mehr Noten aus derselben Oktave die Sympathie der Melodie?"

Ich führe während des Jahres auch eine Analyse des Datensatzes durch, während Daten gesammelt werden.

Was ich versucht habe

Ich kombiniere Daten von allen Tieren in eine einzige riesige Liste mit dicts. Jeder dict stellt eine einzelne Studie und die damit verbundene:

  • Tier ID #
  • Sitzungs-ID #
  • Versuch ID #
  • binäre Antwort (wie/Abneigung)
  • Melodie, die definiert ist durch ein Diktat. Die Tasten sind einfach die gespielten Noten und die Werte zeigen an, wann die Note gespielt wird. Z.B. {'1A#':[30,100]} bedeutet eine Melodie mit nur einer Note, A # von der ersten Oktave, gespielt von 30ms bis 100ms.

Ich speichere dies in einer einzigen Beize-Datei. Jeden Tag, nachdem alle Tiere fertig sind, aktualisiere ich die Beizdatei. Ich führe meine Datenanalyse ungefähr einmal pro Woche durch Laden der aktualisierten Beizdatei durch.

Ich habe versucht, meine Daten in eine Datenbank oder Pandas DataFrame Format wegen der Geschwindigkeit von 1) Serialisierung von Daten und 2) Abfragen und 3) möglich sauberer Code, anstatt mit verschachtelten dicts. Ich dachte zunächst, dass sich meine Daten aufgrund der probeweisen Struktur meines Experiments natürlich gut für eine Tabellenstruktur eignen würden. Leider scheint die Definition von Melodien in der Tabelle heikel zu sein, da die Melodien nicht wirklich eine feste Struktur haben.

Was wären mögliche Alternativen bei der Strukturierung meiner Daten?

+0

ich eine relationale Datenbank verwenden würde und jedes Element einer Melodie in einem separaten Aufnahme Spalte, dh Note1, Note2, Note3, Oktave, Dauer, gespielte Zeit, gespieltes Tier, usw. Sollte zu einem saubereren Code führen und weniger fehleranfällig sein. – postoronnim

Antwort

0

Ich denke, dass der schwierige Teil des Problems ist, dass Sie wahrscheinlich werden die Stimulus (tune) Daten unterschiedlich für verschiedene Abfragen formatiert werden sollen. Was ich darüber denken würde, ist, eine relativ einfache Datenstruktur für Ihre Stimuli (Melodien) zu erstellen und jeder einzelnen Melodie eine eindeutige Kennung hinzuzufügen. Sie könnten wahrscheinlich hier Ihre Wörterbuchstrukturen verwenden, wenn Ihre Struktur in den Speicher passt.

Dann würde ich Ihre Studien in eine relationale Datenbank mit den entsprechenden Stimulus IDs setzen. Jeder Testeintrag in der Datenbank würde vollständige Betreff- und Sitzungsinformationen enthalten.

Ihr für jede Analyse Permutation Sie zwei Schritte tun die relevanten Daten zu erhalten:

  1. Filter die Reize der Reizdatenstruktur und eine Liste ihrer entsprechenden IDs zu erhalten.
  2. Erstellen Sie eine Abfrage in Ihrer Testdatenbank, um die Tests mit diesen Listen-IDs zu erhalten. Sie können andere Parameter zu Ihrer Anfrage hinzuzufügen, offensichtlich, um Filter auf Basis von Subjekt, Sitzung usw.

Ich hoffe, das hilft

2

Ich würde eine relationale Datenbank verwenden, die JSON-Unterstützung hat, zum Beispiel postgresql. Auf diese Weise können Sie die Melodie als JSON-Objekt speichern und müssen sich keine Gedanken über die Struktur der Melodie machen. Der Rest Ihres Datenmodells scheint relational zu sein. Ich würde einen Tisch für Tiere erstellen und dann einen Tisch für Versuche/Sitzungen. So Ihre Session-Tabelle könnte so aussehen

SessionId (integer, primary key) | TrialId (integer) | AnimalId (integer, foreign key) | tune (json) | response (bool)