Соотношение по Python - PullRequest
       6

Соотношение по Python

0 голосов
/ 10 января 2020

У меня есть следующий фрейм данных:

    StockId Date    Value
    1       2015-01-02  -0.070012
    2       2015-01-02  -0.022447
    4       2015-01-02  -0.011474
    6       2015-01-02  0.003796
    13      2015-01-02  -0.032061
    ...
    355     2018-09-14  -0.035717
    356     2018-09-14  -0.007899
    357     2018-09-14  0.065217
    358     2018-09-14  0.063536
    359     2018-09-14  -0.023433 

Я ищу, чтобы найти корреляцию между акциями с течением времени, чтобы найти пять акций, которые наиболее коррелируют с акцией 1. Есть ли быстрый способ сделать это с помощью pandas? Или это требует создания массивов и последующего расчета корреляций один за другим? В кадре данных 359 акций.

1 Ответ

1 голос
/ 10 января 2020

Если ваш фрейм данных представлен в длинном формате, где каждая акция оценивается один раз в день, вы можете использовать функцию pivot для преобразования в широкий формат. Укажите Date в качестве индекса нового фрейма данных и StockID в качестве столбцов. Если у вас есть данные, которые выбираются чаще, чем ежедневно, вы можете указать аргумент aggfunc как min / max / avg или любой другой, который вы считаете подходящим для вашего приложения. Если у вас есть данные, которые выбираются менее чем за день, вы все равно можете запустить код, но помните, что корреляция будет основана на некоторых нулевых значениях.

Примечание: я говорю только ежедневно, потому что именно это подразумевает ваша таблица.

Оттуда вы можете использовать df.corr() для просмотра матрицы корреляции.

df = df.pivot(index='Date', columns='StockID')
df.columns = df.columns.droplevel()  # Convert multi-index to single index
print(df)
# StockID           a         b         c
# Date
# 1/10/2020  0.956625  0.175345  0.999375
# 1/11/2020  0.458859  0.714604  0.995440
# 1/12/2020  0.603331  0.881022  0.215262
# 1/13/2020  0.584198  0.303796  0.332117

matrix = df.corr()
print(matrix)
# StockID         a         b         c
# StockID                              
# a        1.000000 -0.680290  0.305365
# b       -0.680290  1.000000 -0.336229
# c        0.305365 -0.336229  1.000000

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

for stock, corr in matrix.to_dict().items():
    corr = {
        k: v for k, v
        in sorted(corr.items(), key=lambda item: -item[1])
        if k != stock
    }
    print(stock, corr)
# a {'c': 0.30536503121224934, 'b': -0.6802897760166712}
# b {'c': -0.3362290204607999, 'a': -0.6802897760166712}
# c {'a': 0.30536503121224934, 'b': -0.3362290204607999}

Или, если Вы хотите более визуальное сравнение,

plt.matshow(matrix)
plt.colorbar()
plt.show()

enter image description here

...