Есть ли способ сгруппировать строки данных по процентному окну значения в данном наборе данных, а затем выполнить итерацию по набору данных? - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть большой CSV-файл из майнинга некоторых правил ассоциации.Два столбца - это правила и доверительная оценка.

Столбец правил содержит списки элементов различной длины, например

[[Dog],[Dog,Cat],[Dog,Cat,Hamster],[Dog,Cat,Hamster,Goldfish]]

Столбец доверительной оценки содержит список чисел от 0 до 1, например

[0.1, 0.5, 0.1, 0.5]

Я хочу удалить избыточные строки, основываясь на том, является ли значение правила подмножеством других значений правила, но я хочу удалить только строки с аналогичными показателями достоверности (в пределах окна доверия, скажем, 5%).

В вышеприведенном примере останутся строки [Dog] и [Dog, Cat].

[Dog] останутся, потому что [Dog] и [Dog,Cat,Hamster] будутсгруппированные вместе из-за их доверительной вероятности 0,1, тогда [Dog,Cat,Hamster] будет тогда удален, потому что [Dog] является подмножеством [Dog,Cat,Hamster], и, следовательно, правило [Dog,Cat,Hamster] является избыточным.

Аналогично, [Dog,Cat]и [Dog,Cat,Hamster,Goldfish] оба имеют показатель достоверности 0,5, и [Dog,Cat,Hamster,Goldfish] будет удалено, потому что [Dog, Cat] является подмножеством [Dog, Cat, Hamster, Goldfish].

Я знаю первоеМне нужно сделать, это посмотреть на доверитьсяЧтобы оценить наименьшее правило, сгруппируйте все правила, попадающие в доверительное окно этого показателя, а затем удалите все правила, являющиеся надмножеством меньшего правила.Затем мне нужно перейти к следующему наименьшему правилу и делать то же самое, пока все правила не будут сокращены / остановлены.

Мне интересно, есть ли простой способ сделать это в Python / Pandas?

Я довольно новичок в кодировании, поэтому не знаю, возможно ли это вообще.

Спасибо

1 Ответ

0 голосов
/ 15 февраля 2019

Вы можете отсортировать значения пары из двух столбцов как по доверительному значению, так и по длине правил.Тогда у нас сначала будет самый низкий показатель конф, и в правилах с теми же показателями конф первым будет самый короткий список.Мы перебираем эти отсортированные пары rule / conf методом «двумя пальцами».Первый палец - текущая пара правило / конф.Второй палец перемещается до тех пор, пока мы не найдем первое правило, которое является либо неравным показателем конф (например, 0,5, если наш первый палец на 0,1), ИЛИ если правило не является подмножеством (например, встречается ['Hamster'], если наш первый палец включен['Собака']).Когда мы находим такую ​​пару правило / конф, мы добавляем пару правило / конф нашего первого пальца и продвигаем первый палец к только что обработанной паре.Мы продолжаем итерацию, пропуская пары, которые подпадают под наши критерии для удаления, и добавляя и продвигаясь, когда мы находим пары, которые не соответствуют критериям «удаления».Надеюсь, это имеет смысл.

rules = [['Dog'],['Dog','Cat'],['Dog','Cat','Hamster','Goldfish'], ['Dog','Cat','Hamster']]
confs = [0.1, 0.5, 0.1, 0.5]

# sort by conf values and size of rules to put the shortest sub-rule in the front
ruleConfPairs = sorted(zip(rules, confs), key=lambda x: (x[1], len(x[0])))

# initialize iteration
new_rules = []
new_confs = []
current_rule = ruleConfPairs[0][0]
current_conf = ruleConfPairs[0][1]

for rule, conf in ruleConfPairs[1:]:
    if current_conf == conf and set(current_rule).issubset(rule):
        # skip (i.e. remove) pair if it has the same confidence value AND rule is a subset
        continue
    # append current rule/conf pair if either confidence score is not equal OR rule is not a subset
    new_rules.append(current_rule)
    new_confs.append(current_conf)
    # advance our pair
    current_rule = rule
    current_conf = conf

# make sure to append the last pair
new_rules.append(current_rule)
new_confs.append(current_conf)

print(new_rules)
print(new_confs)

Выход:

[['Dog'], ['Dog', 'Cat']]
[0.1, 0.5]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...