复杂音乐分析的数据库设计

时间:2017-01-31 20:49:13

标签: python data-modeling

我是一名研究动物行为的研究员,我正试图找出构建数据的最佳方法。我向动物们提供短小的音乐曲调,并记录下他们的反应。

数据

每首曲子由1-10个音符组成,这些音符从跨越几个八度音阶的主要+次要音阶中随机选择。每个音符都会播放一段固定的时间,但会在很短的时间内随机播放。

然后我记录了动物对曲调的二元回应(喜欢/不喜欢)。

我每天向动物播放> 500个曲调,持续> 300天。我还结合了来自> 10只动物的数据。

我还需要在每天存储变量,例如试验编号(是第一个曲调?最后?等等)和日期,以便我知道由于外部问题而排除哪些数据点(例如动物停止响应经过100次试验或整天试用。)

分析

我试图揭示这些随机生成的曲调中的各种音乐结构会导致动物喜欢/不喜欢。基于以前的研究,我以一种主要以假设为导向的方式来做这件事。我需要在我的数据集上执行的查询具有以下形式:“是否有来自相同八度的更多音符增加了曲调的可爱性?”

随着数据的积累,我也在全年对数据集进行分析。

我尝试了什么

我将所有动物的数据合并到一个包含dicts的巨大列表中。每个dict代表一个单独的试验及其相关的:

  • 动物ID#
  • 会话ID#
  • 试用ID#
  • 二元回应(喜欢/不喜欢)
  • tune,由dict定义。键只是播放的音符,值表示播放音符的时间。例如。 {'1A#':[30,100]}表示仅包含一个音符的曲调,从第1个八度音阶开始的A#,从30ms到100ms播放。

我把它保存到一个pickle文件中。在所有动物完成后的每一天,我都会更新pickle文件。我每周大约运行一次数据分析,加载更新的pickle文件。

我一直在寻找将数据重组为数据库或Pandas DataFrame格式的原因,因为1)序列化数据和2)查询的速度,以及3)可能更清晰的代码,而不是处理嵌套的dicts。我最初认为我的数据自然适合某些表结构,因为我的实验的逐个试验结构。不幸的是,表中曲调的定义似乎很棘手,因为曲调并没有真正的固定结构。

在构建数据时可能有哪些替代方案?

2 个答案:

答案 0 :(得分:2)

我会使用具有JSON支持的关系数据库,例如postgresql。这样,您可以将曲调存储为JSON对象,而不必担心曲调的结构。其余的数据模型似乎是关系型的。我为动物创建了一个表,然后是一个用于试验/会话的表。所以你的会话表可能看起来像

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

答案 1 :(得分:0)

我认为问题的难点在于您可能希望针对不同查询以不同方式格式化刺激(调整)数据。我想做的是为你的刺激(曲调)制作一个相对简单的数据结构,并为每个独特的曲调添加一个唯一的标识符。如果你的结构可以适应内存,你可能会在这里使用你的字典结构。

然后,我会将您的试验放入具有相应刺激ID的关系数据库中。数据库中的每个试验条目都有完整的主题和会话信息。

对于每个分析排列,您将执行两个步骤来获取相关数据:

  1. 使用刺激数据结构过滤刺激并获取其相应ID的列表。
  2. 在您的试用数据库上执行查询以获取具有此列表ID的试用版。显然,您可以向查询添加其他参数,以根据主题,会话等进行过滤。
  3. 我希望有帮助