如何在python中为大型Spark数据帧计算kendall的tau?

时间:2019-07-19 20:32:52

标签: python pandas apache-spark pyspark correlation

我想为大型Spark数据帧计算成对的肯德尔的tau等级相关性。它很大(例如10m行,10k列),无法转换为pandas数据框,然后无法使用pandas.DataFrame.corr进行计算。

此外,每一列都可能具有空值,因此在计算成对肯德尔的tau时,两列中任何一列中具有空值的行都需要排除。

我检查了pyspark.mllib.stat.Statistics.corr。它支持“皮尔逊”和“矛兵”。

    df_rdd = df.rdd.map(lambda row: row[0:])
    corr_mat = Statistics.corr(df_rdd, method='spearman')

斯皮尔曼可能会代替我的肯德尔。 但是,它不会排除空值,因此返回的相关矩阵会受到空值的影响(如果一列包含空值,则与该列的相关性全部变为空值)。

有人遇到过同样的问题吗?将列分成块将仅获得逐块相关矩阵。相反,遍历所有对都是缓慢的……

谢谢!

1 个答案:

答案 0 :(得分:1)

Spark尚不支持Kendalls的排名。但是,如果这对于您来说还不算太晚,我发现您可以使用以下code 进行计算。

这里有个例子:

from operator import add 

#sample data in lists
variable_1 = [106, 86, 100, 101, 99, 103, 97, 113, 112, 110]
variable_2 = [7, 0, 27, 50, 28, 29, 20, 12, 6, 17]

#zip sample data and convert to rdd
example_data = zip(variable_1, variable_2)
example_rdd = sc.parallelize(example_data)

#filer out all your null values. Row containing nulls will be removed
example_rdd = example_rdd.filter(lambda x: x is not None).filter(lambda x: x != "")

#take the cartesian product of example data (generate all possible combinations)
all_pairs = example_rdd.cartesian(example_rdd)

#function calculating concorant and disconordant pairs
def calc(pair):
    p1, p2 = pair
    x1, y1 = p1
    x2, y2 = p2
    if (x1 == x2) and (y1 == y2):
        return ("t", 1) #tie
    elif ((x1 > x2) and (y1 > y2)) or ((x1 < x2) and (y1 < y2)):
        return ("c", 1) #concordant pair
    else:
        return ("d", 1) #discordant pair

#rank all pairs and calculate concordant / disconrdant pairs with calc() then return results
results  = all_pairs.map(calc)

#aggregate the results
results = results.aggregateByKey(0, add, add)

#count and collect
n  = example_rdd.count()
d = {k: v for (k, v) in results.collect()}

# http://en.wikipedia.org/wiki/Kendall_tau_rank_correlation_coefficient
tau = (d["c"] - d["d"]) / (0.5 * n * (n-1))

这可能有所帮助,或者至少为将来提供参考。