Некорректный вывод в матрице корреляций

Подскажите, пожалуйста:

Я строю матрицу корреляций кодом

s = stats.spearmanr(df)
sx, sy = s.correlation.shape
m = []
for y in range(sy):
    row = []
    for x in range(sx):
        z = f'{s.correlation[y,x]:.2f}'
        if s.pvalue[y,x] < 0.01:
            z += '**'
        elif s.pvalue[y,x] < 0.05:
            z += '*'
        row.append(z)
    m.append(row)

df_corr = pd.DataFrame(m)
df_corr.columns = df.columns
df_corr.index = df.columns
df_corr
data = pd.DataFrame(df_corr)

Но почему-то получаю кучу значений nan в матрице (картинка 1). При этом если по тем же самым данным отстроить тепловую матрицу, она получается нормальной (картинка 2).

Может быть, у меня что-то не так в коде, но понять что- пока не могу...

введите сюда описание изображения

П.С. может кто-нибудь знает, как на тепловую матрицу корреляций добавить обозначения уровня значимости корреляций или хотя бы просто убрать значения незначимых корреляций?

Доступ к данным: https://docs.google.com/spreadsheets/d/1kCQQbvMVMEP8lkd2fO7QjKiuRfJzWpDTB6lOm0BvAwE/edit?usp=sharing


Ответы (1 шт):

Автор решения: CrazyElf

У вас просто присутствуют NaN в исходных данных и по умолчанию эта функция выдаёт то поведение, которое вы наблюдаете. Если вы хотите игнорировать NaN и считать корреляцию только по имеющимся значениям, укажите это с помощью соответствующего параметра:

s = stats.spearmanr(df, nan_policy='omit')

Другие методы, считающие корреляцию, могут игнорировать NaN по умолчанию. Например, если взять df.corr(), то он посчитает корреляцию, проигнорировав значения NaN. Скорее всего тепловая карта рисуется с использованием именно этой функции.

→ Ссылка