python - 测量多行的协方差
问题描述
我是 Python 新手,我正在尝试通过执行一些计算来找到自己的方式(我可以在 excel 中轻松完成,但现在我想知道如何在 Python 中完成)。
一种计算是协方差。我有一个简单的例子,我有 3 件商品已售出,每件商品的需求量为 24 个月。
在这里,您可以看到 excel 文件的快照:
目标是测量所有三个项目之间的协方差。因此项目 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 个额外的列。那么如何尽可能高效地为每个项目执行此计算呢?
解决方案
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')
注意:协方差矩阵包括与自身的协方差 = 每个项目的方差。
推荐阅读
- c# - C#Selenium如何获取元素所有子元素的outerhtml
- css - 如何调整容器的大小以适合使用“object-fit:contain”的画布
- javascript - Sails.js 通过 id 查找错误 javascript
- database - 是否有一个公共数据库包含诸如 mobile.de 或 autoscout24 等二手车网站的条目?
- android - 为什么在 Flutter 中使用 setState 时我的列表没有更新
- c# - 我的 WPF 按钮需要更改不同按钮的内容
- java - 如何使用注释设置测试方法执行的优先级?
- image - 'Welcome to Jekyll' 帖子中缺少 Kitty 图像,但在 index.md 和 about.md 中显示
- java - 我必须创建一个需要使用线程的应用程序,但它们不能正常工作
- android - LottieAnimationView 在 Android 中不显示图像缩放效果