用于时间序列分析的数据收集和存储

机器算法验证 时间序列 数据集
2022-03-26 03:34:36

我正在为 inplay 体育赛事的客户设计一种数据捕获方法,他希望每半秒记录一次赔率变动,以便以后在 Excel 中进行分析。我想做到这一点,以便在其他包中轻松使用数据进行分析。

更多的背景和假设。

  • 每个事件可以有 4 - 40 名竞争者 (c)
  • 每个事件有 10 个变量,同样适用于所有竞争者 (e)
  • 每个竞争者有 20 个具有相同标题/类型的变量,其值对竞争者 (i) 是唯一的

本质上我需要在

  • 1. 1 行有 1 个时间帧,所以每个时间帧捕获都有

所需列 = e+max(c)i = 810

所需行数 = 1

好:易于操作,一行数据,1 行描述每行事件中的所有竞争者。

不好:大量的列,如果 c 小于 max(c) 则有大量空白列数据,难以跨多列搜索名称

或者

  • 2. 在多行上有 1 个时间帧,所以每个时间帧都有

所需列 = e+i =30

所需行数 = c

好:更少的列,易于搜索/过滤为同一列中的所有名称

不好:不同竞争者的不同行中的时间范围

有关系吗?包处理这两种形式的数据是否容易?我的客户不知道答案,但想要最好的解决方案!我倾向于 2. 因为用数据库术语管理和搜索要容易得多,但不确定时间序列分析的准备工作?哪位有经验的可以给点建议吗?

谢谢奥斯

2个回答

选项 #2 比 #1 灵活得多,特别是如果您计划使用 Excel 数据透视表和/或 R 包,例如 Hadley Wickham 的出色reshape包。我将存储数据,以便每一行包含测量(事件级别和竞争者级别)变量和唯一标识测量变量实例所需的任何变量(竞争者 ID、事件 ID、测量场合 ID [例如,半秒增量])用于事件中的单个测量场合。这允许将数据最灵活地重塑为所需的任何其他格式,Wickham 将这一过程描述为熔化和铸造。您可以将数据导出到逗号分隔值 (CSV) 电子表格中,当然可以将其读取到 Excel 和大多数其他统计软件中。

如果您在 Excel 中有长格式数据,则使用数据透视表也可以轻松聚合、汇总和制表数据这使您能够创建客户可能感兴趣的数据的不同视图,这样当数据更新时,您也可以更新这些有用的视图。

IMO,对于非常大量的结构化数据,最强大的解决方案是您没有提到的:将它们存储在关系数据库中(使用例如 MS Access 或开源数据库,如 PostgreSQL)并使用结构化查询语言(SQL ) 执行上述操作。在这里,您的数据将被分解为单独的表格,其中包含事件独有的信息(例如,事件 ID、事件类型等)、竞争者(例如,竞争者 ID、竞争者名称等)、唯一的事件-竞争者组合(因为单个参赛者可能参加多个赛事,而每个赛事肯定有不止一个参赛者),以及以半秒为间隔的测量数据。这避免了存储冗余数据,并允许您在添加、删除或更新数据时强制执行您在问题中阐明的数据的完整性。有一些方法可以从 Excel、R、Matlab 和其他统计程序中调用 SQL 查询,以仅提取客户想要的信息。关于关系数据库理论和应用的有用介绍性文本是 Whitehorn 和 Marklyn 的“Inside Relational Databases”。

根据我的经验,#1 是更好的选择。如果您将数据存储在任何平面文件设置中(如您所建议的那样)并且不将行作为您的时间变量,则将其导入选定的程序变得更加困难。

例如,我主要在 Fortran/C 中工作,偶尔在 R 或 MATLAB 中完成辅助应用程序。为了与所有这些兼容,我使用 ASCII 平面文件来存储我的大部分数据,具有固定列宽、固定精度的报告。任何时候我必须使用不是以这种方式设置的东西,无论存储数据的方法多么性感或新颖,它总是会很麻烦。

只要您找到正确标记它们的方法,拥有空列实际上并不是问题。将它们留空实际上并不是最好的选择,因为这可以读取(即在 Fortran 中)为 0,这对于大多数应用程序来说与空值完全不同。如果您认为您的客户会想要使用任何类型的基于编程语言的分析,那么您会想要尝试提出一种一致的方式来存储/标记缺失值。例如,如果您的所有数据样本都是正实数,则存储 -99.99 是将条目标记为缺失的好方法。

结论:弄清楚您的客户可能需要什么。如果你真的不知道,那么就选择#1,因为它对于多种程序和编程语言来说是最通用和最容易阅读的。如果您使用 ASCII 平面文件,请记住将维度信息存储在文件顶部,或者如果您使用二进制文件,请记住将维度信息存储在定义的数据块中。