测量多行的协方差

Measuring covariance on several rows

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

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

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

Items and their demand over 24 months

目标是测量所有三个项目之间的协方差。因此,项目 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):

Items, their demand and the average

下面应该做的计算是计算项目 1 和项目 2 之间的协方差。这在数学上是这样完成的:

(第 1 项的“1”列 - 第 1 项的第 "avg" 列)*(第 2 项的“1”列 - 第 2 项的第 "avg" 列)。必须对“1”至“24”列执行此操作,即 24 次。这应该向文件 df 添加 24 列。

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

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

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

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')

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