有没有办法用熊猫计算加权相关系数?我看到R有这样的方法.另外,我想获得相关性的p值.我没有在R.链接到维基百科中找到有关加权相关性的解释:https://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient#Weighted_correlation_coefficient
我有两个包含数百列的CSV_files,我想为两个CSV_files的每个相同列计算Pearson相关系数和p值.问题是当一列中缺少数据"NaN"时,它会给我一个错误.当".dropna"从列中删除nan值时,有时X和Y的形状不相等(基于移除的nan值)并且我收到此错误:
"ValueError:操作数无法与形状一起广播(1020,)(1016,)"
问题:如果在"nan"中的一个csv中的第8行,是否有任何方法可以从其他csv中删除相同的行,并根据具有两个csv文件值的行对每个列进行分析?
import pandas as pd
import scipy
import csv
import numpy as np
from scipy import stats
df = pd.read_csv ("D:/Insitu-Daily.csv",header = None)
dg = pd.read_csv ("D:/Model-Daily.csv",header = None)
pearson_corr_set = []
pearson_p_set = []
for i in range(1,df.shape[1]):
    X= df[i].dropna(axis=0, how='any')
    Y= dg[i].dropna(axis=0, how='any')
    [pearson_corr, pearson_p] = scipy.stats.stats.pearsonr(X, Y)
    pearson_corr_set = np.append(pearson_corr_set,pearson_corr)
    pearson_p_set = np.append(pearson_p_set,pearson_p)
with open('D:/Results.csv','wb') as file:
    str1 = ",".join(str(i) for i in np.asarray(pearson_corr_set))
    file.write(str1)
    file.write('\n')    
    str1 = ",".join(str(i) for i in np.asarray(pearson_p_set))
    file.write(str1)
    file.write('\n') 
让我先说一下,为了重现这个问题,我需要一个大数据,这是问题的一部分,我无法预测什么时候会出现这种特殊性。无论如何,数据太大(~13k 行,2 列)无法粘贴到问题中,我在帖子末尾添加了一个 pastebin 链接。
在过去的几天里,我遇到了一个奇怪的问题pandas.core.window.rolling.Rolling.corr。我有一个数据集,我试图在其中计算滚动相关性。这就是问题:
在计算
window_size=100两列 (aandb)之间的滚动 ( ) 相关性时:一些索引(一个这样的索引是12981)给出接近的0值(顺序1e-10),但理想情况下它应该返回nanorinf,(因为一列中的所有值都是常数)。但是,如果我只是计算与该索引有关的独立相关性(即包括所述索引的最后 100 行数据),或者对较少数量的行(例如 300 或 1000 而不是 13k)执行滚动计算,我得到正确的结果(即nan或inf。)
>>> df = pd.read_csv('sample_corr_data.csv') # link at the end,  ## columns = ['a', 'b']
>>> df.a.tail(100).value_counts()
 0.000000    86
-0.000029     3
 0.000029     3
-0.000029     2
 0.000029     2
-0.000029     2
 0.000029     2
Name: a, dtype: int64 …考虑以下用户A和B对胶片评级集的Pearson相关系数的例子:
A = [2,4,4,4,4]
B = [5,4,4,4,4]
pearson(A,B) = -1
A = [5,5,5,5,5]
B = [5,5,5,5,5]
pearson(A,B) = NaN
Pearson相关似乎被广泛用于计算协同过滤中两组之间的相似性.然而,上面的集合显示出高(甚至完美)相似性,但是输出表明集合是负相关的(或者由于div为零而遇到错误).
我最初认为这是我实施中的一个问题,但我已经对一些在线计算器进行了验证.
如果输出正确,为什么Pearson相关性被认为是这个应用的一个好选择?
recommendation-engine collaborative-filtering pearson-correlation
我有一个包含项目特征值的CSV文件:每一行都是三元组(id_item,id_feature,value),表示特定项目的特定功能的值.数据非常稀少.
我需要计算两个项目距离矩阵,一个使用Pearson相关作为度量,另一个使用Jaccard索引.
目前我实现了内存解决方案,我做了类似这样的事情:
import numpy as np
from numpy import genfromtxt
from scipy.sparse import coo_matrix
from scipy.sparse import csr_matrix
from scipy.stats.stats import pearsonr
import sklearn.metrics.pairwise
import scipy.spatial.distance as ds
import scipy.sparse as sp
# read the data
my_data = genfromtxt('file.csv', delimiter=',')
i,j,value=my_data.T
# create a sparse matrix
m=coo_matrix( (value,(i,j)) )
# convert in a numpy array
m = np.array(m.todense())
# create the distance matrix using pdist
d = ds.pdist(m.T, 'correlation')
d= ds.squareform(d)
它工作得很好而且速度非常快但不能水平扩展.我希望能够通过向集群添加节点来提高性能,并且即使在大数据场景中,一切都可以工作,再次只是添加节点.我不在乎这个过程需要几个小时; 距离需要每天更新一次.
什么是最好的方法?
1)Sklearn pairwise_distances有一个n_jobs参数,允许利用并行计算(http://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.pairwise_distances.html)但据我所知支持同一台机器上的多个核心,而不支持群集计算.这是一个相关的问题在HPC上使用scikit-learn函数的并行选项的简单方法, …
原始问题
我将大小为n的行P与大小为n×m的矩阵O的每列相关联.我精心设计了以下代码:
import numpy as np
def ColumnWiseCorrcoef(O, P):
    n = P.size
    DO = O - (np.sum(O, 0) / np.double(n))
    DP = P - (np.sum(P) / np.double(n))
    return np.dot(DP, DO) / np.sqrt(np.sum(DO ** 2, 0) * np.sum(DP ** 2))
它比天真的方法更有效:
def ColumnWiseCorrcoefNaive(O, P):
    return np.corrcoef(P,O.T)[0,1:O[0].size+1]
以下是我在Intel核心上使用numpy-1.7.1-MKL的时间:
O = np.reshape(np.random.rand(100000), (1000,100))
P = np.random.rand(1000)
%timeit -n 1000 A = ColumnWiseCorrcoef(O, P)
1000 loops, best of 3: 787 us per loop
%timeit -n 1000 B = ColumnWiseCorrcoefNaive(O, P)
1000 loops, best of …假设我有一个由 20 列(变量)组成的数据框,并且它们都是数字。我总是可以使用corR 中的函数来获取矩阵形式的相关系数或实际可视化相关矩阵(相关系数也被标记)。假设我只想根据相关系数值对对进行排序,如何在 R 中执行此操作?
我有一个名为“df”的时间序列 Pandas 数据框。它有一根柱子和以下形状:(2000, 1)。下面的数据框的头部显示了其结构:
            Weight
Date    
2004-06-01  1.9219
2004-06-02  1.8438
2004-06-03  1.8672
2004-06-04  1.7422
2004-06-07  1.8203
目标
我正在尝试使用“for 循环”来计算“权重”变量在不同时间范围或时间间隔内的百分比变化之间的相关性。这样做是为了评估不同时间段内饲养牲畜的影响。
该循环可以在下面找到:
from scipy.stats.stats import pearsonr
# Loop for producing combinations of different timelags and holddays 
# and calculating the pearsonr correlation and p-value of each combination 
for timelags in [1, 5, 10, 25, 60, 120, 250]:
    for holddays in [1, 5, 10, 25, 60, 120, 250]:
        weight_change_lagged = df.pct_change(periods=timelags)
        weight_change_future = df.shift(-holddays).pct_change(periods=holddays)
        if (timelags >= holddays):
            indepSet=range(0, weight_change_lagged.shape[0], holddays)
        else:
            indepSet=range(0, …我有一个数据框,每行包含大约 500 个产品类别的总销售额。所以我的数据框中有 500 列。我试图找到与另一个数据框列相关性最高的类别。所以我将使用皮尔逊相关法。但所有类别的总销售额都是高度倾斜的数据,所有类别列的倾斜程度在 10 到 40 之间。所以我想使用 boxcox 转换来记录转换此销售数据。由于我的销售数据也有 0 值,因此我想使用 boxcox1p 函数。有人可以帮助我,如何计算 boxcox1p 函数的 lambda,因为它是该函数的强制参数?另外,这是我的问题陈述找到高度相关类别的正确方法吗?
我不仅想在我的seaborn 热图上注释大于0.4 的值。
这是我的代码:
sns.set(font_scale=0.6)
sns.set(font_scale=0.6)
ax= sns.heatmap(corr, mask=mask, cmap=cmap, vmin=-1, vmax=+1, center=0,
            square=True, linewidths=.1, cbar_kws={"shrink": .82},annot=True,
            fmt='.1',annot_kws={"size":7})
ax.set_xticklabels(ax.get_xticklabels(), rotation=60)
这就是我得到的: 在此处输入图像描述
谢谢
python ×7
numpy ×3
pandas ×3
correlation ×2
annotations ×1
arrays ×1
bigdata ×1
dataframe ×1
for-loop ×1
hadoop ×1
heatmap ×1
logging ×1
nan ×1
performance ×1
r ×1
scikit-learn ×1
scipy ×1
seaborn ×1
sorting ×1