- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Pandas 数据框(97165 行和 2 列),我想为每 100 行计算并保存这些列之间的相关性我想要这样的事情:
第一个相关性 --> 从 0 到 100 的行 --> corr = 0.265
第二次相关 --> 从 1 到 101 的行 --> corr = 0.279
第三个相关性 --> 从 2 到 102 的行 --> corr = 0.287
每个值都必须存储并显示在图中,所以我必须将所有这些值保存在列表或类似的东西中。
我一直在阅读与滚动窗口相关的 pandas 文档 pandas rolling window但我什么也做不了。我试图生成一个简单的循环来获得一些结果,但我遇到了内存问题,我尝试过的代码是:
lcl = 100
a = []
for i in range(len(tabla)):
x = tabla.iloc[i:lcl, [0]]
y = tabla.iloc[i:lcl, [1]]
z = x['2015_Avion'].corr(y['2015_Hotel'])
a.append(z)
lcl += 1
有什么建议吗?
最佳答案
我们可以通过处理数组数据来优化内存和性能。
方法 #1
首先,让我们有一个数组解决方案来获取两个 1D
数组之间对应元素的相关系数。这基本上会受到 this post
的启发。看起来像这样 -
def corrcoeff_1d(A,B):
# Rowwise mean of input arrays & subtract from input arrays themeselves
A_mA = A - A.mean(-1,keepdims=1)
B_mB = B - B.mean(-1,keepdims=1)
# Sum of squares
ssA = np.einsum('i,i->',A_mA, A_mA)
ssB = np.einsum('i,i->',B_mB, B_mB)
# Finally get corr coeff
return np.einsum('i,i->',A_mA,B_mB)/np.sqrt(ssA*ssB)
现在,要使用它,请在数组数据上使用相同的循环 -
lcl = 100
ar = tabla.values
N = len(ar)
out = np.zeros(N)
for i in range(N):
out[i] = corrcoeff_1d(ar[i:i+lcl,0], ar[i:i+lcl,1])
我们可以通过使用卷积
预先计算用于计算corrcoeff_1d
中的A_mA
的滚动平均值来进一步优化性能,但首先让我们排除内存错误。
方法 #2
这是一种几乎向量化的方法,因为我们将向量化大部分迭代,除了末尾没有适当窗口长度的剩余切片。循环计数将从 97165
减少到 lcl-1
,即仅 99
。
lcl = 100
ar = tabla.values
N = len(ar)
out = np.zeros(N)
col0_win = strided_app(ar[:,0],lcl,S=1)
col1_win = strided_app(ar[:,1],lcl,S=1)
vectorized_out = corr2_coeff_rowwise(col0_win, col1_win)
M = len(vectorized_out)
out[:M] = vectorized_out
for i in range(M,N):
out[i] = corrcoeff_1d(ar[i:i+lcl,0], ar[i:i+lcl,1])
辅助函数 -
# https://stackoverflow.com/a/40085052/ @ Divakar
def strided_app(a, L, S ): # Window len = L, Stride len/stepsize = S
nrows = ((a.size-L)//S)+1
n = a.strides[0]
return np.lib.stride_tricks.as_strided(a, shape=(nrows,L), strides=(S*n,n))
# https://stackoverflow.com/a/41703623/ @Divakar
def corr2_coeff_rowwise(A,B):
# Rowwise mean of input arrays & subtract from input arrays themeselves
A_mA = A - A.mean(-1,keepdims=1)
B_mB = B - B.mean(-1,keepdims=1)
# Sum of squares across rows
ssA = np.einsum('ij,ij->i',A_mA, A_mA)
ssB = np.einsum('ij,ij->i',B_mB, B_mB)
# Finally get corr coeff
return np.einsum('ij,ij->i',A_mA,B_mB)/np.sqrt(ssA*ssB)
NaN 填充数据的相关性
接下来列出了基于 Pandas 的 NumPy 解决方案,用于计算一维数组和行相关值之间的相关性。
1) 两个一维数组之间的标量相关值-
def nancorrcoeff_1d(A,B):
# Get combined mask
comb_mask = ~(np.isnan(A) & ~np.isnan(B))
count = comb_mask.sum()
# Rowwise mean of input arrays & subtract from input arrays themeselves
A_mA = A - np.nansum(A * comb_mask,-1,keepdims=1)/count
B_mB = B - np.nansum(B * comb_mask,-1,keepdims=1)/count
# Replace NaNs with zeros, so that later summations could be computed
A_mA[~comb_mask] = 0
B_mB[~comb_mask] = 0
ssA = np.inner(A_mA,A_mA)
ssB = np.inner(B_mB,B_mB)
# Finally get corr coeff
return np.inner(A_mA,B_mB)/np.sqrt(ssA*ssB)
2) 两个 2D
数组 (m,n)
之间的行相关,给我们一个 1D
形状的数组 (m,)
-
def nancorrcoeff_rowwise(A,B):
# Input : Two 2D arrays of same shapes (mxn). Output : One 1D array (m,)
# Get combined mask
comb_mask = ~(np.isnan(A) & ~np.isnan(B))
count = comb_mask.sum(axis=-1,keepdims=1)
# Rowwise mean of input arrays & subtract from input arrays themeselves
A_mA = A - np.nansum(A * comb_mask,-1,keepdims=1)/count
B_mB = B - np.nansum(B * comb_mask,-1,keepdims=1)/count
# Replace NaNs with zeros, so that later summations could be computed
A_mA[~comb_mask] = 0
B_mB[~comb_mask] = 0
# Sum of squares across rows
ssA = np.einsum('ij,ij->i',A_mA, A_mA)
ssB = np.einsum('ij,ij->i',B_mB, B_mB)
# Finally get corr coeff
return np.einsum('ij,ij->i',A_mA,B_mB)/np.sqrt(ssA*ssB)
关于Python生成滚动窗口计算相关性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46757318/
我有一个如下所示的数据框: Samples GENE GEN1 GEN2 GEN3 GEN4 GEN5 Sample1 21.0 160 110 3.90 2.62 16.5 Sa
我有以下映射 posts":{ "properties":{ "prop1": { "type": "nested", "properties": { "item
我有两个维度相等的矩阵(p 和 e),我想在同名的列之间建立斯 PIL 曼相关。我想在矩阵 (M) 中输出对相关性 我使用了 Psych 库中的 corr.test() 函数,这是我所做的: libr
我有两个维度相等的矩阵(p 和 e),我想在同名的列之间建立斯 PIL 曼相关。我想在矩阵 (M) 中输出对相关性 我使用了 Psych 库中的 corr.test() 函数,这是我所做的: libr
我正在尝试使用 estpost 和 community-contributed 命令将 Spearman 相关矩阵导出到 rtf 或 Excel 文件中 esttab。 但是,我收到以下错误: inv
我在网上找到了以下查询: SELECT company_title FROM companies WHERE company_title like '%gge%' GROUP BY compa
我是 Sphinx 和 Lucene 的重度用户。Sphinx 只需要一个数据库,对其进行索引。然后您调用 Sphinx 获取 ID。 但是,如果我想创建一个非常微型 的搜索引擎怎么办?就几行数据,几
是否有我要在下面描述的模式/算法的名称?... 假设您有一棵像这样的相关数据树: IDEs Visual Studio Visual Studio 2008 Visual Studio 2010 Ec
早上好。这是我的问题:我有几个文件,如下所示: 104 0.1697 12.3513214 15.9136214 112 -0.3146 12.0517303 14.8027303 122 0.271
在尝试将function_score与boost_mode: "sum"一起使用时(因为这样可以更轻松地跟踪不同的贡献),我想归一化查询相关性对整体文档分数的影响,但是为此,我需要知道它可以取什么值。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
X,Y 的 spearmanr(Spearman 相关性)输出为我提供以下信息: 相关性:0.54542821980327882 P 值:2.3569040685361066e-65 其中 len(X
我有一个 Pandas 数据框,它有一个七年时间范围内的日期时间索引和 10 种不同 Assets 的价格数据。我想运行 dataframe.corr 函数来评估 Assets 之间的关系,我的问题是
我有相同数据(公司)的 2 个信息源,我可以通过唯一 ID(契约(Contract)号)将它们连接在一起。第二个不同来源的存在是由于这两个来源是手动独立更新的。所以我在 2 个表中有一个 ID 和一个
我正在尝试在php中实现两组数据之间人员相关系数的计算。我只是想做可以在这个 url 上找到的移植 python 脚本 http://answers.oreilly.com/topic/1066-ho
所以我使用 PHP Symfony 和 Ongr-Elasticsearch 包来查询我的文档并返回匹配的对象。结果似乎按相关性/分数排序,但实际相关性/分数不包含在对象本身中。 这可能吗?我想将分数
我想使用滚动窗口计算 DataFrame 两列之间的 Spearman 和/或 Pearson 相关性。 我试过df['corr'] = df['col1'].rolling(P).corr(df['
我正在处理一个大型数据集。不过,我将从一个小示例开始,以说明我要实现的目标。 我有以下向量: season %group_by(season, round, team)%>%dplyr::mutate
我正在使用 OIDC 的混合身份验证流程。 options.Events.OnRedirectToIdentityProvider = redirectContext =>
我正在尝试查询我的产品ElasticSearch索引并创建一个script_score,但我一直收到错误Variable [relevancy] is not defined. 我尝试只用一个数字替换
我是一名优秀的程序员,十分优秀!