复杂音乐分析的数据库设计
Database design for complex music analytics
我是一名研究动物行为的研究员,我正在尝试找出构建数据的最佳方式。我向动物展示简短的音乐曲调并记录他们的反应。
数据
每首曲子由 1-10 个音符组成,这些音符是从跨越几个八度的大调 + 小调音阶中随机选择的。每个音符播放固定时间,但会在短时间内随机播放 window。
然后我记录下动物对曲调的二元反应(喜欢/不喜欢)。
我每天给动物播放 >500 首曲子,持续 >300 天。我还结合了超过 10 种动物的数据。
我还需要存储变量,例如每天的试用编号(是第一首曲子吗?最后一首?等等)和日期,这样我就知道由于外部问题(例如动物)要排除哪些数据点在 100 次试验或一整天后停止响应)。
分析
我正试图揭示这些随机生成的曲调中的哪种音乐结构会导致动物 likes/dislikes。基于之前的研究,我主要以假设驱动的方式来做这件事。我需要对我的数据集执行的查询采用以下形式:"does having more notes from the same octave increase likeability of the tune?"
随着数据的积累,我也在全年对数据集进行分析。
我试过的
我将所有动物的数据合并到一个包含字典的巨大列表中。每个 dict 代表一个单独的试验及其相关的:
- 动物 ID#
- 会话 ID#
- 试用 ID#
- 二进制响应 (like/dislike)
- tune,由dict定义。键只是弹奏的音符,值表示音符弹奏的时间。例如。
{'1A#':[30,100]}
表示只有一个音符的曲调,第一个八度的 A#,播放时间为 30 毫秒到 100 毫秒。
我将其保存到单个 pickle 文件中。每天完成所有动物后,我都会更新 pickle 文件。我 运行 我通过加载更新的 pickle 文件大约每周进行一次数据分析。
我一直在寻求将我的数据重组为数据库或 Pandas DataFrame 格式,因为 1) 序列化数据和 2) 查询的速度,以及 3) 可能更简洁的代码而不是处理嵌套的字典。我最初认为我的数据自然会很好地适应某些 table 结构,因为我的实验采用逐个试验结构。不幸的是,table 中曲调的定义似乎很棘手,因为曲调实际上并没有固定的结构。
在构建我的数据时有哪些可能的替代方案?
我会使用具有 JSON 支持的关系数据库,例如 postgresql。这样,您就可以将乐曲存储为 JSON 对象,而不必担心乐曲的结构。您的数据模型的其余部分似乎是相关的。我会为动物创建 table,然后为 trials/sessions 创建 table。所以你的会话 table 可能看起来像
SessionId (integer, primary key) | TrialId (integer) | AnimalId (integer, foreign key) | tune (json) | response (bool)
我认为问题的难点在于您可能希望刺激(调谐)数据针对不同的查询采用不同的格式。我想做的是为您的刺激(曲调)制作一个相对简单的数据结构,并为每个独特的曲调添加一个唯一的标识符。如果您的结构适合内存,您可能可以在这里使用字典结构。
然后我会将您的试验与相应的刺激 ID 放入关系数据库中。数据库中的每个试验条目都将具有完整的主题和会话信息。
对于每个分析排列,您将执行两个步骤来获取相关数据:
- 使用刺激数据结构过滤刺激并获取其对应 ID 的列表。
- 对您的试验数据库执行查询以获取具有此列表 ID 的试验。显然,您可以向查询添加其他参数,以根据主题、会话等进行过滤。
希望对你有所帮助
我是一名研究动物行为的研究员,我正在尝试找出构建数据的最佳方式。我向动物展示简短的音乐曲调并记录他们的反应。
数据
每首曲子由 1-10 个音符组成,这些音符是从跨越几个八度的大调 + 小调音阶中随机选择的。每个音符播放固定时间,但会在短时间内随机播放 window。
然后我记录下动物对曲调的二元反应(喜欢/不喜欢)。
我每天给动物播放 >500 首曲子,持续 >300 天。我还结合了超过 10 种动物的数据。
我还需要存储变量,例如每天的试用编号(是第一首曲子吗?最后一首?等等)和日期,这样我就知道由于外部问题(例如动物)要排除哪些数据点在 100 次试验或一整天后停止响应)。
分析
我正试图揭示这些随机生成的曲调中的哪种音乐结构会导致动物 likes/dislikes。基于之前的研究,我主要以假设驱动的方式来做这件事。我需要对我的数据集执行的查询采用以下形式:"does having more notes from the same octave increase likeability of the tune?"
随着数据的积累,我也在全年对数据集进行分析。
我试过的
我将所有动物的数据合并到一个包含字典的巨大列表中。每个 dict 代表一个单独的试验及其相关的:
- 动物 ID#
- 会话 ID#
- 试用 ID#
- 二进制响应 (like/dislike)
- tune,由dict定义。键只是弹奏的音符,值表示音符弹奏的时间。例如。
{'1A#':[30,100]}
表示只有一个音符的曲调,第一个八度的 A#,播放时间为 30 毫秒到 100 毫秒。
我将其保存到单个 pickle 文件中。每天完成所有动物后,我都会更新 pickle 文件。我 运行 我通过加载更新的 pickle 文件大约每周进行一次数据分析。
我一直在寻求将我的数据重组为数据库或 Pandas DataFrame 格式,因为 1) 序列化数据和 2) 查询的速度,以及 3) 可能更简洁的代码而不是处理嵌套的字典。我最初认为我的数据自然会很好地适应某些 table 结构,因为我的实验采用逐个试验结构。不幸的是,table 中曲调的定义似乎很棘手,因为曲调实际上并没有固定的结构。
在构建我的数据时有哪些可能的替代方案?
我会使用具有 JSON 支持的关系数据库,例如 postgresql。这样,您就可以将乐曲存储为 JSON 对象,而不必担心乐曲的结构。您的数据模型的其余部分似乎是相关的。我会为动物创建 table,然后为 trials/sessions 创建 table。所以你的会话 table 可能看起来像
SessionId (integer, primary key) | TrialId (integer) | AnimalId (integer, foreign key) | tune (json) | response (bool)
我认为问题的难点在于您可能希望刺激(调谐)数据针对不同的查询采用不同的格式。我想做的是为您的刺激(曲调)制作一个相对简单的数据结构,并为每个独特的曲调添加一个唯一的标识符。如果您的结构适合内存,您可能可以在这里使用字典结构。
然后我会将您的试验与相应的刺激 ID 放入关系数据库中。数据库中的每个试验条目都将具有完整的主题和会话信息。
对于每个分析排列,您将执行两个步骤来获取相关数据:
- 使用刺激数据结构过滤刺激并获取其对应 ID 的列表。
- 对您的试验数据库执行查询以获取具有此列表 ID 的试验。显然,您可以向查询添加其他参数,以根据主题、会话等进行过滤。
希望对你有所帮助