问题标签 [bi-temporal]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
144 浏览

python - 在双时态数据集上计算移动平均线

我正在尝试计算双时态数据集的移动平均值。数据集由数据日期和生效日期(数据可用的日期)组成。该日期的数据将来可能会多次重述(数据日期相同但生效日期不同)。我需要使用对正在计算的行的生效日期有效的数据来计算过去 4 个季度的移动平均值。

数据集看起来像这样

ID 数据日期 有效日期 价值
1 2005-03-31 2005-04-15 10
1 2005-03-31 2005-05-30 11
1 2005-06-30 2005-07-15 9
1 2005-06-30 2005-08-20 9.5
1 2005-06-30 2005-10-15 9.6
1 2005-09-30 2005-10-15 10.5
1 2005-09-30 2005-11-10 11
1 2005-09-30 2006-02-20 10.75
1 2005-12-31 2006-02-13 12
1 2005-12-31 2006-02-20 11.6
1 2005-12-31 2006-05-10 11
1 2006-03-31 2006-04-20 8
1 2006-03-31 2006-05-10 8.25

结果应该是

ID 数据日期 有效日期 价值 平均
0 1 2005-03-31 2005-04-15 10 10
1 1 2005-03-31 2005-05-30 11 11
2 1 2005-06-30 2005-07-15 9 10
3 1 2005-06-30 2005-08-20 9.5 10.25
4 1 2005-06-30 2005-10-15 9.6 10.30
5 1 2005-09-30 2005-10-15 10.5 10.37
6 1 2005-09-30 2005-11-10 11 10.53
7 1 2005-09-30 2006-02-20 10.75 10.45
8 1 2005-12-31 2006-02-13 12 10.9
9 1 2005-12-31 2006-02-20 11.5 10.71
10 1 2005-12-31 2006-05-10 11 10.59
11 1 2006-03-31 2006-04-20 8 9.96
12 1 2006-03-31 2006-05-10 8.25 9.9

我正在使用熊猫在 python 中执行此操作。我这样做的方式是通过在 id 和前 4 个季度上加入数据框,并根据过去 4 个季度的 effdates 计算所有时期的新​​ effdates,然后我再次加入 id、datadate 和 effdate 并计算平均值。

这很有效,但是当我在从 2000 年到最近一个季度(大约 500K 行)有大约 2000 个不同 id 和数据日期的完整数据集上运行它时它非常慢,我必须计算不同窗口的几个字段的移动平均值。所以我想看看是否有一种有效的方法来做到这一点。

0 投票
1 回答
121 浏览

oracle - SCHEMA 更改后如何避免中断临时表中的查询?

想象一下,我有一张个人信息的临时表:

  • UUID (varchar)
  • main_document (varchar)
  • 名称(varchar)
  • DoB(时间戳)
  • 流派(varchar)
  • 地址(varchar)
  • 工资(十进制)

T1我运行模式迁移并添加一个新列,从现在开始,表有:

  • UUID (varchar)
  • main_document (varchar)
  • 名称(varchar)
  • DoB(时间戳)
  • 流派(varchar)
  • 地址(varchar)
  • 工资(十进制)
  • 电子邮件(varchar)*

然后在T2运行另一个模式迁移并将 main_document 的数据类型更改为 NUMBER。

  • UUID (varchar)
  • main_document ( NUMBER )*
  • 名称(varchar)
  • DoB(时间戳)
  • 流派(varchar)
  • 地址(varchar)
  • 工资(十进制)
  • 电子邮件(varchar)

然后在T3我运行另一个模式迁移并删除流派列

  • UUID (varchar)
  • main_document(编号)
  • 名称(varchar)
  • DoB(时间戳)
  • --------------- *
  • 地址(varchar)
  • 工资(十进制)
  • 电子邮件(varchar)

然后在T4我运行另一个模式迁移并添加流派列,但现在它具有数据类型 NUMBER。

  • UUID (varchar)
  • main_document(编号)
  • 名称(varchar)
  • DoB(时间戳)
  • 流派 (NUMBER) *
  • 地址(varchar)
  • 工资(十进制)
  • 电子邮件(varchar)

如果架构在 T1、T2、T3、T4 等上发生更改,我如何查询我的数据库(及时返回)?

就像,我们在(墙上时间)T4并运行: select * from people AS OF T3,应该返回什么?真的是时间旅行吗?

是否有任何最佳实践或策略来避免这些临时表 + 模式迁移的所有这些复杂性?

任何帮助将非常感激。

谢谢