Оценка сходства для фильтрации столбцов данных в пандах

avatar
msh855
8 августа 2021 в 23:10
154
1
0

У меня есть кадр данных pandas, df со следующими именами столбцов

columns = ['Baillie Gifford Positive Change Fund B Accumulation',
 'Stewart Investors Worldwide Select Fund Class B (accumulation) Gbp',
 'Stewart Investors Worldwide Select Fund Class A (accumulation) Gbp',
 'Close Ftse Techmark Fund X Acc',
 'Stewart Investors Asia Pacific Leaders Fund Class B (accumulation) Gbp',
 'Stewart Investors Asia Pacific Leaders Fund Class A (accumulation) Gbp',
 'Stewart Investors Worldwide Sustainability Fund Class A (accumulation) Gbp',
 'Stewart Investors Worldwide Sustainability Fund Class B (accumulation) Gbp',
 'Mi Somerset Emerging Markets Dividend Growth A Accumulation Shares',
 'Axa Framlington Biotech Fund Gbp Z Acc',
 'Stewart Investors Global Emerging Markets Sustainability Fund Class B (accumulation) Gbp',
 'Schroder Asian Income Fund L Accumulation Gbp',
 'Fidelity Active Strategy - Fast - Asia Fund Y-acc-gbp',
 'Lf Miton Uk Value Opportunities Fund B Institutional Accumulation',
 'Liontrust India Fund C Acc Gbp',
 'Fidelity Asian Dividend Fund W Acc',
 'Stewart Investors Global Emerging Markets Sustainability Fund Class A (accumulation) Gbp',
 'Quilter Investors Emerging Markets Equity Growth Fund U2 (gbp) Accumulation',
 'Man Glg Continental European Growth Fund Retail Accumulation Shares (class A)',
 'Quilter Investors Europe (ex Uk) Equity Growth Fund A (gbp) Accumulation']

Я хочу отфильтровать похожие столбцы и сохранить один из них.

Например, 'Stewart Investors Worldwide Select Fund Class B (accumulation) Gbp', аналогично 'Stewart Investors Worldwide Select Fund Class A (accumulation) Gbp',

Я подумал, что здесь могут помочь некоторые показатели сходства, используемые в НЛП для идентификации похожего текста. Но не знаю как применить в моем случае.

Ожидаемым результатом должен быть список (который я буду использовать для фильтрации моего фрейма данных), который содержит один из похожих текстов. Например:

columns_filtered = ['Baillie Gifford Positive Change Fund B Accumulation',
 'Stewart Investors Worldwide Select Fund Class B (accumulation) Gbp',
 'Close Ftse Techmark Fund X Acc',
 'Stewart Investors Asia Pacific Leaders Fund Class A (accumulation) Gbp',
 'Stewart Investors Worldwide Sustainability Fund Class B (accumulation) Gbp',
 'Mi Somerset Emerging Markets Dividend Growth A Accumulation Shares',
 'Axa Framlington Biotech Fund Gbp Z Acc',
 'Stewart Investors Global Emerging Markets Sustainability Fund Class B (accumulation) Gbp',
 'Schroder Asian Income Fund L Accumulation Gbp',
 'Fidelity Active Strategy - Fast - Asia Fund Y-acc-gbp',
 'Lf Miton Uk Value Opportunities Fund B Institutional Accumulation',
 'Liontrust India Fund C Acc Gbp',
 'Fidelity Asian Dividend Fund W Acc',
 'Stewart Investors Global Emerging Markets Sustainability Fund Class A (accumulation) Gbp',
 'Quilter Investors Emerging Markets Equity Growth Fund U2 (gbp) Accumulation',
 'Man Glg Continental European Growth Fund Retail Accumulation Shares (class A)',
 'Quilter Investors Europe (ex Uk) Equity Growth Fund A (gbp) Accumulation']

Любая помощь?

Источник
woblob
9 августа 2021 в 10:52
0

Отвечает ли это на ваш вопрос? Найти показатель сходства между двумя строками

msh855
9 августа 2021 в 11:24
0

если у меня есть 10 столбцов, проверка каждой пары означает, что нужно проверить 10 * 10 различных комбинаций для проверки. Итак, как я могу это реализовать, когда фактическое количество столбцов равно 100? Есть ли масштабируемое решение?

woblob
9 августа 2021 в 11:56
0

хитрое решение: вы можете попробовать отсортировать columns, а затем проверить сходство между соседями. Это даст вам O(nlog(n) + n) => O(nlog(n)), вместо O(n^2).

Ответы (1)

avatar
msh855
9 августа 2021 в 20:27
0

Я нашел решение

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity 
import numpy as np


vectorizer = CountVectorizer().fit_transform(df.columns.tolist())
vector = vectorizer.toarray()

similarity_score = cosine_similarity(vector)


df_similarity = pd.DataFrame(np.asmatrix(similarity_score))
df_similarity.columns = df.columns
df_similarity.index = df.columns
df_similarity

df_similarity — это кадр данных, в котором хранится индекс сходства имени каждого столбца с именами других столбцов.

Обратите внимание, что я использовал одну из оценок сходства, используемых в НЛП. Можно использовать любую оценку сходства.