python 两极:如何计算日间的滞后相关系数?

iq0todco  于 2023-01-29  发布在  Python
关注(0)|答案(1)|浏览(207)

我有一个polars Dataframe 如下:

import polars as pl

df = pl.DataFrame(
    {
        "class": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
        "day": [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4],
        "id": [1, 2, 3, 2, 3, 4, 1, 2, 5, 2, 1, 3, 4],
        "value": [1, 2, 2, 3, 5, 2, 1, 2, 7, 3, 5, 3, 4],
    }
)

我想要的结果是:

  • 按“类”分组(虽然本例中只有一个,但假设有很多)。
  • 计算所有可能的日对的所有成对相关性,例如“日”-1和“日”-2、“日”-2和“日”-4等。
  • 一个特定的“天”对之间的两个序列从“值”中取出并通过“id”匹配,并且仅考虑交点来计算相关性,例如“天”-1和“天”-4之间的相关性是[1,2,2]和[5,3,3]之间的相关性。

我可能想这样组织结果:

class cor_day_1_2 cor_day_1_3 cor_day_1_4 cor_day_2_3 cor_day_2_4 cor_day_3_4
1     -           -           -           -           -           -
.
.
.

我已经尝试使用df.pivot开始,但被几个原因卡住了:

  • 需要进行转置(可能会扩展)
  • 否则,计算行相关性(不要认为它是开箱即用的)

非常感谢您的潜在帮助。

rjee0c15

rjee0c151#

下面是一个尝试开始:使用.join()按类、id分组,然后过滤掉重复项。

(df.join(df, on=["class", "id"])
   .filter(pl.col("day") != pl.col("day_right"))
   .groupby(["class", "day", "day_right"]).agg_list()
   .with_columns(
      pl.concat_list(["class", "day", "day_right"])
        .arr.sort().arr.to_struct()
        .alias("row_id"))
   .unique(subset="row_id")
)
shape: (6, 7)
┌───────┬─────┬───────────┬───────────┬───────────┬─────────────┬───────────┐
│ class | day | day_right | id        | value     | value_right | row_id    │
│ ---   | --- | ---       | ---       | ---       | ---         | ---       │
│ i64   | i64 | i64       | list[i64] | list[i64] | list[i64]   | struct[3] │
╞═══════╪═════╪═══════════╪═══════════╪═══════════╪═════════════╪═══════════╡
│ 1     | 4   | 2         | [2, 3, 4] | [3, 3, 4] | [3, 5, 2]   | {1,2,4}   │
│ 1     | 2   | 3         | [2]       | [3]       | [2]         | {1,2,3}   │
│ 1     | 3   | 4         | [1, 2]    | [1, 2]    | [5, 3]      | {1,3,4}   │
│ 1     | 1   | 3         | [1, 2]    | [1, 2]    | [1, 2]      | {1,1,3}   │
│ 1     | 1   | 4         | [1, 2, 3] | [1, 2, 2] | [5, 3, 3]   | {1,1,4}   │
│ 1     | 1   | 2         | [2, 3]    | [2, 2]    | [3, 5]      | {1,1,2}   │
└───────┴─────┴───────────┴───────────┴───────────┴─────────────┴───────────┘

相关问题