为 Pandas 中的 2 个变量创建具有相关性的 DataFrame

Creating a DataFrame with Correlations for 2 variables in Pandas

我目前有一个 pandas 数据框,我对其进行了大量操作,其中包含硬币的每日变化百分比和 Twitter 情绪的每日变化百分比。数据框如下所示:


+------------+-------------------+-----------------------+
|            | % Change in Price | % Change in Sentiment |
+------------+-------------------+-----------------------+
| 2019-01-31 |             12.4% |                   10% |
+------------+-------------------+-----------------------+
| 2019-02-01 |              115% |                   84% |
+------------+-------------------+-----------------------+
| 2019-02-02 |               62% |                   33% |
+------------+-------------------+-----------------------+
| 2019-02-03 |               14% |                  -15% |
+------------+-------------------+-----------------------+
| ...        | ...               | ...                   |
+------------+-------------------+-----------------------+
| 2021-06-29 | 12%               | 72%                   |
+------------+-------------------+-----------------------+
| 2021-06-30 | 18%               | 62%                   |
+------------+-------------------+-----------------------+

我想做的是创建一个新的数据框,计算价格变化百分比和情绪变化百分比两列之间的每月相关性,最终输出如下所示:

+------------+-------------+
|            | Correlation |
+------------+-------------+
| 2019-01-01 |         .43 |
+------------+-------------+
| 2019-02-01 |         .15 |
+------------+-------------+
| 2019-03-01 |         .09 |
+------------+-------------+
| 2019-04-01 |         .35 |
+------------+-------------+
| ...        | ...         |
+------------+-------------+
| 2021-05-01 | -.88        |
+------------+-------------+
| 2021-06-01 | -.12        |
+------------+-------------+

感谢您对此的支持!

假设您想要 Pearson Correlation Coefficient:

df.groupby(pd.Grouper(freq='M')).corr().iloc[0::2,-1].droplevel(1)

说明

df.groupby(pd.Grouper(freq='M')) → 按月分组

.corr() → 应用 PCC(默认情况下,其他可用)以获得每个月的 2x2 矩阵

到目前为止很简单。接下来的两个步骤是繁琐/丑陋的部分:

.iloc[0::2,-1] → 取出每个矩阵的第一个元素(这是每个矩阵中唯一有趣的变量)

.droplevel(1) → 我们剩下一个不需要的多索引,所以删除第二部分

也许有一个稍微干净的方法,没有最后两个步骤...