首页 > 解决方案 > 测量多行的协方差

问题描述

我是 Python 新手,我正在尝试通过执行一些计算来找到自己的方式(我可以在 excel 中轻松完成,但现在我想知道如何在 Python 中完成)。

一种计算是协方差。我有一个简单的例子,我有 3 件商品已售出,每件商品的需求量为 24 个月。

在这里,您可以看到 excel 文件的快照:

超过 24 个月的物品及其需求

目标是测量所有三个项目之间的协方差。因此项目 1 和 2、1 和 3 以及 2 和 3 之间的协方差。而且,我想知道如何处理超过 3 个项目,比如说一千个项目。

计算如下:

首先,我必须计算每个项目的平均值。这已经是我通过执行以下代码发现的:

导入以下内容后:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

我导入了文件:

df = pd.read_excel("Directory\\Covariance.xlsx")

并计算每行的平均值:

x=df.iloc[:,1:].values
df['avg'] = x.mean(axis=1)

这为文件提供了一个额外的列,即平均值 (avg):

项目,他们的需求和平均

应该进行的以下计算是计算例如项目 1 和 2 之间的协方差。这在数学上如下完成:

(项目 1 的列“1”-项目 1 的列“avg”)*(项目 2 的列“1”-项目 2 的列“avg”)。这必须对列“1”到“24”进行,所以 24 次。这应该将 24 列添加到文件 df.

在此之后,我们应该取这些列的平均值,并显示第 1 项和第 2 项之间的协方差。因为我们必须这样做 N-1 次,所以在这个简单的例子中,我们应该有 2 个协方差数(对于第一项,与第 2 项和第 3 项的协方差,对于第二项,与第 1 项和第 3 项的协方差,对于第三项,与第 1 项和第 2 项的协方差)。

所以第一个问题是;我怎样才能为这 3 个项目实现这一点,以便文件有一个列显示每个项目 2 个协方差结果(第一个项目应该有一个列有项目 1 和 2 的协方差数,第二个列有项目之间的协方差数1 和 3,依此类推……)。

第二个问题当然是:如果我有 1000 个项目怎么办;然后我如何有效地做到这一点,因为这样我每个项目有 999 个协方差数,因此有 999 个额外的列,但如果我通过上述方法计算它,还有 999*25 个额外的列。那么如何尽可能高效地为每个项目执行此计算呢?

标签: pythonpandasstatisticscovariance

解决方案


Pandas 有一个内置函数来计算协方差矩阵,但首先你需要确保你的数据框格式正确。数据中的第一列实际上包含行标签,所以让我们将它们放在索引中:

df = pd.read_excel("Directory\\Covariance.xlsx", index_col=0)

然后你也可以更容易地计算平均值,但不要把它放回你的数据框中!

avg = df.mean(axis=1)

要计算协方差矩阵,只需调用.cov(). 但是,这会计算列的成对协方差,以首先转置数据帧:

cov = df.T.cov()

如果需要,您可以将所有内容放在 1 个数据框中:

df['avg'] = avg
df = df.join(cov, rsuffix='_cov')

注意:协方差矩阵包括与自身的协方差 = 每个项目的方差。


推荐阅读