Если ваш фрейм данных представлен в длинном формате, где каждая акция оценивается один раз в день, вы можете использовать функцию 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()