как получить количество периодов, используемых pd.corr()

#pandas #correlation

#pandas #корреляция

Вопрос:

Как я могу определить качество корреляции, полученной с помощью pd.corr() ?

И под качеством я подразумеваю, какая часть данных перекрывается и, таким образом, используется .corr() . Давайте проиллюстрируем это коротким примером:

Давайте настроим образец фрейма данных:

 time1 = pd.date_range(start='2020-01-01', end='2020-01-5', freq='D')
time2 = pd.date_range(start='2020-01-04', end='2020-01-8', freq='D')
time3 = pd.date_range(start='2020-01-01', end='2020-01-8', freq='D')
df1 = pd.DataFrame(np.random.randn(len(time1)), index=time1, columns=['first'])
df2 = pd.DataFrame(np.random.randn(len(time2)), index=time2, columns=['second'])
df3 = pd.DataFrame(np.random.randn(len(time3)), index=time3, columns=['third'])
df4 = pd.DataFrame(np.random.randn(len(time3)), index=time3, columns=['forth'])
df = pd.concat([df1,df2,df3,df4], axis=1)
  

КАК вы можете видеть, first и second совместно используют только две точки данных, тогда как third и forth имеют данные за весь период и, таким образом, разделяют все это между собой, и 5 точек данных с first и second соответственно.

Или в графическом:

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

Очевидно, что каждый раз это будет отличаться из-за np.random.randn , но в этом особом случае это прекрасно иллюстрирует мою точку зрения. Если мы посмотрим на корреляционную матрицу, df.corr()

            first    second     third     forth
first   1.000000  1.000000  0.034076 -0.023059
second  1.000000  1.000000 -0.021810  0.928713
third   0.034076 -0.021810  1.000000  0.458744
forth  -0.023059  0.928713  0.458744  1.000000
  

Мы не только видим ожидаемую идеальную корреляцию диагонали, но, по-видимому, first и second также имеем идеальную корреляцию (тот же градиент на графике). Теперь, математически, это, похоже, верно, однако, предполагая, что во всех трех столбцах наблюдаются одинаковые явления, я бы назвал корреляции для других, особенно third и forth лучше, поскольку у меня гораздо больше доступных данных.

Действительно ли у first и second корреляция лучше, чем у других, покажет, когда у меня будет такой же объем данных.

Теперь с таким простым фреймом данных получить эту информацию довольно тривиально, но давайте предположим, что фрейм данных содержит несколько сотен записей и раз, начиная с 1930-х годов, и эта простая визуальная идентификация становится утомительной, если не невозможной.

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

pd.corr() есть опция min_periods , поэтому я мог бы установить это значение min_periods = 3 , чтобы отменить корреляцию с низким перекрытием в этом примере, но реальные данные, я бы предпочел ничего не исключать, а просто иметь информацию о количестве периодов, которые были использованы для получения корреляции.

Ответ №1:

Я еще не нашел быстрого и простого способа получить цифры, но для моего приложения также работает быстрый визуальный обзор.

С приведенными выше тестовыми данными это на самом деле не требуется, но давайте продолжим использовать их в иллюстративных целях.

Простой plt.imshow(df, aspect='auto') работает довольно хорошо. Но поскольку меня интересуют только данные по сравнению нет данных (таким образом, любое число против NaN), умножение его на ноль работает лучше (NaN остается как есть и окрашивается в белый цвет imshow , любое число становится равным нулю и, таким образом, приобретает цвет. Итак:

 plt.imshow((df*0), aspect='auto')
  

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

Или с какими- то реальными данными:

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

Не идеально (поэтому я не собираюсь принимать этот ответ), но хороший первый шаг для определения, какие данные хороши, а какие нет.