Как получить корреляционную матрицу фрейма данных pyspark?

У меня есть большой фрейм данных pyspark. Я хочу получить его корреляционную матрицу. Я знаю, как получить это с помощью фрейма данных pandas, но мои данные слишком велики, чтобы преобразовать их в pandas. Поэтому мне нужно получить результат с фреймом данных pyspark. Я искал другие похожие вопросы, ответы у меня не работают. Кто-нибудь может мне помочь? Благодарность!

Пример данных: пример данных


person Chemmyyu    schedule 07.09.2018    source источник


Ответы (1)


Добро пожаловать в SO!

Пример данных

Я подготовил фиктивные данные для упрощения репликации (возможно, в следующий раз вы также можете предоставить несколько простых для копирования данных ;-)):

data = pd.DataFrame(np.random.random((10, 5)), 
                   columns=["x{}".format(x) for x in range(5)])
df = spark.createDataFrame(data)

df.show()

А вот данные:

+-------------------+-------------------+-------------------+-------------------+--------------------+
|                 x0|                 x1|                 x2|                 x3|                  x4|
+-------------------+-------------------+-------------------+-------------------+--------------------+
| 0.9965335347601945|0.09311299224360992| 0.9273393764180728| 0.8523333283310564|  0.5040716744686445|
| 0.2341313103221958| 0.9356109544246494| 0.6377089480113576| 0.8129047787928055| 0.22215891357547046|
| 0.6310473705907303| 0.2040705293700683|0.17329601185489396| 0.9062007987480959| 0.44105687572209895|
|0.27711903958232764| 0.9434521502343274| 0.9300724702792151| 0.9916836130997986|  0.6869145183972896|
| 0.8247010263098201| 0.6029990758603708|0.07266306799434707| 0.6808038838294564| 0.27937146479120245|
| 0.7786370627473335|0.17583334607075107| 0.8467715537463528|   0.67702427694934|  0.8976402177586831|
|0.40620117097757724| 0.5080531043890719| 0.3722402520743703|0.14555317396545808|  0.7954133091360741|
|0.20876805543974553| 0.9755867281355178| 0.7570617946515066| 0.6974893162590945|0.054708580878511825|
|0.47979629269402546| 0.1851379589735923| 0.4786682088989791| 0.6809358266732168|  0.8829180507209633|
| 0.1122983875801804|0.45310988757198734| 0.4713203140134805|0.45333792855503807|  0.9189083355172629|
+-------------------+-------------------+-------------------+-------------------+--------------------+

Решение

В подпакете ml pyspark.ml.stat есть функция корреляции. Однако для этого требуется предоставить столбец типа Vector. Поэтому вам нужно сначала преобразовать столбцы в векторный столбец с помощью _5 _, а затем примените корреляцию:

from pyspark.ml.stat import Correlation
from pyspark.ml.feature import VectorAssembler

# convert to vector column first
vector_col = "corr_features"
assembler = VectorAssembler(inputCols=df.columns, outputCol=vector_col)
df_vector = assembler.transform(df).select(vector_col)

# get correlation matrix
matrix = Correlation.corr(df_vector, vector_col)

Если вы хотите получить результат в виде массива numpy (в вашем драйвере), вы можете использовать следующее:

matrix.collect()[0]["pearson({})".format(vector_col)].values

array([ 1.        , -0.66882741, -0.06459055,  0.21802534,  0.00113399,
       -0.66882741,  1.        ,  0.14854203,  0.09711389, -0.5408654 ,
       -0.06459055,  0.14854203,  1.        ,  0.33513733,  0.09001684,
        0.21802534,  0.09711389,  0.33513733,  1.        , -0.37871581,
        0.00113399, -0.5408654 ,  0.09001684, -0.37871581,  1.        ])
person pansen    schedule 07.09.2018
comment
Большое спасибо. Получил матрицу. Еще один вопрос, знаете ли вы, как легко добавить в матрицу заголовок (название столбца)? - person Chemmyyu; 10.09.2018
comment
Порядок столбцов должен оставаться прежним. Следовательно, вы можете просто использовать df.columns для получения имен столбцов. - person pansen; 10.09.2018
comment
Здравствуйте, как бы напечатать нормальную матрицу корр. он выводится следующим образом: i.stack.imgur.com/uBRRU.png - person abdoulsn; 30.10.2019
comment
@abdoulsn Вам придется изменить массив numpy. Один из способов сделать это показан ниже. Обратите внимание, что это квадратная матрица. cor_np = matrix.collect () [0] [pearson ({}). format (vector_col)]. values; dim = len (cor_np); cor_mat = cor_np.reshape ((тусклый, тусклый)); - person Gobryas; 18.04.2020
comment
Я получаю ошибку при выполнении второй части, чтобы увидеть массив - person Rotail; 16.07.2020
comment
@Rotail Какую версию Spark вы используете? - person pansen; 27.07.2020
comment
Предупреждение: запускать только для числовых столбцов :) str_col_names = [элемент [0] для элемента в my_df.dtypes, если элемент [1] .startswith ('string')] num_col_names = [элемент для элемента в my_df.schema.names, если элемент отсутствует в str_col_names] - person RndmSymbl; 20.05.2021