簡體   English   中英

給定一個包含 n 列數字的數據框,您如何計算所有列對組合的 Pearson 相關性?

[英]Given a data frame with n columns of numbers, how could you calculate the Pearson correlation of all column-pair combinations?

假設我有一個這樣的 Polars 數據框:

=> shape: (19, 5)
┌───────────────┬─────────┬───────────┬───────────┬──────────┐
│ date          ┆ open_AA ┆ open_AADI ┆ open_AADR ┆ open_AAL │
│ ---           ┆ ---     ┆ ---       ┆ ---       ┆ ---      │
│ i64           ┆ f64     ┆ f64       ┆ f64       ┆ f64      │
╞═══════════════╪═════════╪═══════════╪═══════════╪══════════╡
│ 1674777600000 ┆ 51.39   ┆ 12.84     ┆ 50.0799   ┆ 16.535   │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
│ 1674691200000 ┆ 52.43   ┆ 13.14     ┆ 49.84     ┆ 16.54    │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
│ 1674604800000 ┆ 51.87   ┆ 12.88     ┆ 49.75     ┆ 15.97    │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
│ 1674518400000 ┆ 51.22   ┆ 12.81     ┆ 50.1      ┆ 16.01    │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
│ ...           ┆ ...     ┆ ...       ┆ ...       ┆ ...      │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
│ 1672876800000 ┆ 45.3    ┆ 12.7      ┆ 47.185    ┆ 13.5     │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
│ 1672790400000 ┆ 44.77   ┆ 12.355    ┆ 47.32     ┆ 12.86    │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
│ 1672704000000 ┆ 45.77   ┆ 12.91     ┆ 47.84     ┆ 12.91    │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
│ 1672358400000 ┆ 46.01   ┆ 12.57     ┆ 47.29     ┆ 12.55    │
└───────────────┴─────────┴───────────┴───────────┴──────────┘

我正在尋找計算所有列(日期一除外)的每個對組合之間的 Pearson 相關性。 結果看起來像這樣:

=> shape: (5, 5)
┌───────────────┬─────────┬───────────┬───────────┬──────────┐
│ symbol        ┆ open_AA ┆ open_AADI ┆ open_AADR ┆ open_AAL │
│ ---           ┆ ---     ┆ ---       ┆ ---       ┆ ---      │
│ utf8          ┆ f64     ┆ f64       ┆ f64       ┆ f64      │
╞═══════════════╪═════════╪═══════════╪═══════════╪══════════╡
│ open_AA       ┆ 1       ┆ 1         ┆ .1        ┆ -.5      │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
│ open_AADI     ┆ .2      ┆ 1         ┆ .2        ┆ .4       │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
│ open_AADR     ┆ .4      ┆ .2        ┆ 1         ┆ .3       │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
│ open_AAL.     ┆ -.45    ┆ -.6       ┆ 50.1      ┆ 1        │
└───────────────┴─────────┴───────────┴───────────┴──────────┘

我的直覺是我需要執行以下操作:

  1. 獲取列 [1..] 的笛卡爾積作為新數據框。
  2. 使用 Polars 表達式,計算每個序列對的pearson_corr

我是 Polars 的新手,語法有問題。 誰能指出我正確的方向?

說你開始:

df = pl.DataFrame({"date":[5,6,7],"foo": [1, 3, 9], "bar": [4, 1, 3], "ham": [2, 18, 9]})

你想排除一些列,所以讓我們把它們放在一個變量中

excl_cols=['date']

然后...

(
df.drop(excl_cols) # Use drop to exclude the date column (or whatever columns you don't want)
    .pearson_corr() # this is the meat and potatos of the request but it's missing your symbol column on left
.select(
    [
        pl.Series(df.drop(excl_cols).columns).alias('symbol'), # This just creates a Series out of the column names to become its own column
        pl.all() #then just every other column
    ]) 
)
shape: (3, 4)
┌────────┬───────────┬───────────┬───────────┐
│ symbol ┆ foo       ┆ bar       ┆ ham       │
│ ---    ┆ ---       ┆ ---       ┆ ---       │
│ str    ┆ f64       ┆ f64       ┆ f64       │
╞════════╪═══════════╪═══════════╪═══════════╡
│ foo    ┆ 1.0       ┆ -0.052414 ┆ 0.169695  │
│ bar    ┆ -0.052414 ┆ 1.0       ┆ -0.993036 │
│ ham    ┆ 0.169695  ┆ -0.993036 ┆ 1.0       │
└────────┴───────────┴───────────┴───────────┘

使用DataFrame.pearson_corr

In [9]: df.drop('date').pearson_corr()
Out[9]:
shape: (2, 2)
┌─────────┬───────────┐
│ open_AA ┆ open_AADI │
│ ---     ┆ ---       │
│ f64     ┆ f64       │
╞═════════╪═══════════╡
│ 1.0     ┆ 1.0       │
│ 1.0     ┆ 1.0       │
└─────────┴───────────┘

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM