kdb 更新列并根据组执行排序,然后根据日期排名更新另一列
kdb update column and perform a sort based on group and then update another column based on date rank
我下面有一个 table 例如,
- 如何按升序对日期进行排序,对于那些我们希望expiration_date按升序排序的日期。
- 一旦我们这样做了,我们想将符号系统添加到 sym 列,
所以最近的到期日将表示为 ESc1!然后第二近的是 ESc2!
- 我们应该在到期日 - 1 滚动到下一个合约,所以在到期前一天我们将更改 ESc2!将更改为 ESc1!
date sym expiration_date
2021-11-01 ES1! 2021-12-17
2021-11-01 ES2! 2022-03-18
2021-11-01 ES3! 2022-06-17
2021-11-02 ES1! 2021-12-17
2021-11-02 ES2! 2022-03-18
2021-11-02 ES3! 2022-06-17
2021-11-03 ES1! 2021-12-17
2021-11-03 ES2! 2022-03-18
2021-11-03 ES3! 2022-06-17
2021-11-12 ES1! 2021-12-17
2021-11-12 ES2! 2022-03-18
2021-11-12 ES3! 2022-12-16
2021-11-12 ES4! 2022-06-17
2021-11-15 ES1! 2021-12-17
2021-11-15 ES2! 2022-03-18
2021-11-16 ES1! 2021-12-17
2021-11-16 ES2! 2022-03-18
2021-11-16 ES3! 2022-06-17
预期输出
date sym expiration_date
2021-11-01 ES1! 2021-12-17
2021-11-01 ES2! 2022-03-18
2021-11-01 ES3! 2022-06-17
2021-11-01 ESc1! 2021-12-17
2021-11-01 ESc2! 2022-03-18
2021-11-01 ESc3! 2022-06-17
2021-11-02 ES1! 2021-12-17
2021-11-02 ES2! 2022-03-18
2021-11-02 ES3! 2022-06-17
2021-11-02 ESc1! 2021-12-17
2021-11-02 ESc2! 2022-03-18
2021-11-02 ESc3! 2022-06-17
2021-11-03 ES1! 2021-12-17
2021-11-03 ES2! 2022-03-18
2021-11-03 ES3! 2022-06-17
2021-11-03 ESc1! 2021-12-17
2021-11-03 ESc2! 2022-03-18
2021-11-03 ESc3! 2022-06-17
2021-11-12 ES1! 2021-12-17
2021-11-12 ES2! 2022-03-18
2021-11-12 ES3! 2022-12-16
2021-11-12 ES4! 2022-06-17
2021-11-12 ESc1! 2021-12-17
2021-11-12 ESc2! 2022-03-18
2021-11-12 ESc3! 2022-06-17
2021-11-12 ESc4! 2022-12-16
2021-11-15 ES1! 2021-12-17
2021-11-15 ES2! 2022-03-18
2021-11-15 ESc1! 2021-12-17
2021-11-15 ESc2! 2022-03-18
2021-11-16 ES1! 2021-12-17
2021-11-16 ES2! 2022-03-18
2021-11-16 ES3! 2022-06-17
2021-11-16 ESc1! 2021-12-17
2021-11-16 ESc2! 2022-03-18
2021-11-16 ESc3! 2022-06-17
您可以尝试这样的操作:
ungroup select
sym:{ES:`$"ES",/:string[1+til count?[(.z.d-1)=a 0;1_a;a:asc x]],\:"!";
ES,`${ssr[string x;"ES";"ESc"]}each ES}expiration_date,
{raze 2#enlist?[(.z.d-1)=a 0;1_a;a:asc x]}expiration_date
by date from tbl
编辑:更新任务第 3 部分的代码。
这里的代码按日期先按日期对tbl进行排序,然后使用asc的逻辑expiration_date,我们可以检查第一个到期日期是否等于昨天。如果是这样,我们将其从列表中删除。
对符号列使用相同的检查,我们知道每个日期的 expiration_date 计数,因此我们可以应用我们的 ES* 和 ESc* 函数。
我下面有一个 table 例如,
- 如何按升序对日期进行排序,对于那些我们希望expiration_date按升序排序的日期。
- 一旦我们这样做了,我们想将符号系统添加到 sym 列, 所以最近的到期日将表示为 ESc1!然后第二近的是 ESc2!
- 我们应该在到期日 - 1 滚动到下一个合约,所以在到期前一天我们将更改 ESc2!将更改为 ESc1!
date sym expiration_date
2021-11-01 ES1! 2021-12-17
2021-11-01 ES2! 2022-03-18
2021-11-01 ES3! 2022-06-17
2021-11-02 ES1! 2021-12-17
2021-11-02 ES2! 2022-03-18
2021-11-02 ES3! 2022-06-17
2021-11-03 ES1! 2021-12-17
2021-11-03 ES2! 2022-03-18
2021-11-03 ES3! 2022-06-17
2021-11-12 ES1! 2021-12-17
2021-11-12 ES2! 2022-03-18
2021-11-12 ES3! 2022-12-16
2021-11-12 ES4! 2022-06-17
2021-11-15 ES1! 2021-12-17
2021-11-15 ES2! 2022-03-18
2021-11-16 ES1! 2021-12-17
2021-11-16 ES2! 2022-03-18
2021-11-16 ES3! 2022-06-17
预期输出
date sym expiration_date
2021-11-01 ES1! 2021-12-17
2021-11-01 ES2! 2022-03-18
2021-11-01 ES3! 2022-06-17
2021-11-01 ESc1! 2021-12-17
2021-11-01 ESc2! 2022-03-18
2021-11-01 ESc3! 2022-06-17
2021-11-02 ES1! 2021-12-17
2021-11-02 ES2! 2022-03-18
2021-11-02 ES3! 2022-06-17
2021-11-02 ESc1! 2021-12-17
2021-11-02 ESc2! 2022-03-18
2021-11-02 ESc3! 2022-06-17
2021-11-03 ES1! 2021-12-17
2021-11-03 ES2! 2022-03-18
2021-11-03 ES3! 2022-06-17
2021-11-03 ESc1! 2021-12-17
2021-11-03 ESc2! 2022-03-18
2021-11-03 ESc3! 2022-06-17
2021-11-12 ES1! 2021-12-17
2021-11-12 ES2! 2022-03-18
2021-11-12 ES3! 2022-12-16
2021-11-12 ES4! 2022-06-17
2021-11-12 ESc1! 2021-12-17
2021-11-12 ESc2! 2022-03-18
2021-11-12 ESc3! 2022-06-17
2021-11-12 ESc4! 2022-12-16
2021-11-15 ES1! 2021-12-17
2021-11-15 ES2! 2022-03-18
2021-11-15 ESc1! 2021-12-17
2021-11-15 ESc2! 2022-03-18
2021-11-16 ES1! 2021-12-17
2021-11-16 ES2! 2022-03-18
2021-11-16 ES3! 2022-06-17
2021-11-16 ESc1! 2021-12-17
2021-11-16 ESc2! 2022-03-18
2021-11-16 ESc3! 2022-06-17
您可以尝试这样的操作:
ungroup select
sym:{ES:`$"ES",/:string[1+til count?[(.z.d-1)=a 0;1_a;a:asc x]],\:"!";
ES,`${ssr[string x;"ES";"ESc"]}each ES}expiration_date,
{raze 2#enlist?[(.z.d-1)=a 0;1_a;a:asc x]}expiration_date
by date from tbl
编辑:更新任务第 3 部分的代码。
这里的代码按日期先按日期对tbl进行排序,然后使用asc的逻辑expiration_date,我们可以检查第一个到期日期是否等于昨天。如果是这样,我们将其从列表中删除。
对符号列使用相同的检查,我们知道每个日期的 expiration_date 计数,因此我们可以应用我们的 ES* 和 ESc* 函数。