def cos_sim(data_frame):
    a = data_frame.values
n = a.shape[-1]
out = np.ravel(np.zeros(shape=(n, n)))
for i in range(n):
    r = np.roll(a, -i, axis=1)
cs = np.sum(a[:, :n - i] * r[:, :n - i], axis=0) / (np.sqrt(np.sum(a[:, :n -
    i] * a[:, :n - i], axis=0)) * np.sqrt(np.sum(r[:, :n - i] * r[:, :n - i
    ], axis=0)))
out[i:n * n - i * n:n + 1] = cs
return out.reshape((n, n))
эффективный способ расчета расстояния между комбинациями столбцов фрейма данных pandas