«Корреляционная матрица» для строк. Сходство номинальных данных - PullRequest
0 голосов
/ 20 января 2019

Вот мой фрейм данных.df

  store_1      store_2         store_3         store_4     

0 banana      banana           plum            banana
1 orange      tangerine        pear            orange
2 apple       pear             melon           apple
3 pear        raspberry        pineapple       plum
4 plum        tomato           peach           tomato

Я ищу способ подсчета количества совпадений в магазинах (для сравнения их сходства).

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Вы можете попробовать что-то вроде этого

import itertools as it
corr = lambda a,b: len(set(a).intersection(set(b)))/len(a)
c = [corr(*x) for x in it.combinations_with_replacement(df.T.values.tolist(),2)]

j = 0
x = []
for i in range(4, 0, -1): # replace 4 with df.shape[-1]
    x.append([np.nan]*(4-i) + c[j:j+i])
    j+= i
pd.DataFrame(x, columns=df.columns, index=df.columns)

Что дает

        store_1 store_2 store_3 store_4
store_1 1.0     0.4     0.4     0.8
store_2 NaN     1.0     0.2     0.4
store_3 NaN     NaN     1.0     0.2
store_4 NaN     NaN     NaN     1.0
0 голосов
/ 20 января 2019

Если вы хотите оценить сходство магазинов в отношении их товаров, то вы можете использовать:

Одно горячее кодирование

Тогда каждый магазин может быть описан вектором с длиной n = количество всех товаров среди всех магазинов, например:

банан оранжевый яблоко груша слива tangerin малина помидор дыня , , .

Store_1 тогда описывается как 1 1 1 1 1 0 0 0 0 0 ... Store_2 1 0 0 1 0 1 1 1 0 ...

Это дает вам числовой вектор, где вы можете вычислить меру различия, такую ​​как евклидово расстояние.

...