#python #pandas #dataframe #numpy #statistics
Вопрос:
У меня есть данные, которые выглядят так
sno Sequence conversion
1 A-B-C-D-E-B-A 1
2 A-B-C-D 0
3 A-B-C-D 1
4 D-E-H-I-A 0
5 Z 0
6 A-Z 0
7 F-E-T-H-S-A-T-J-F-E-D-E-S-X-G-N-N-K-L-D 1
8 H-S-A-T-J-F-E 0
Данные содержат Последовательности, которые могут начинаться и заканчиваться чем угодно случайным образом. В конце последовательности есть флаг, который гласит преобразование. Это «1», если последовательность преобразуется, и 0, если последовательность не преобразуется. Я хочу выяснить, как отдельные части последовательности влияют на преобразование, находя условную вероятность преобразования каждой части последовательности или комбинации этих отдельных под-последовательностей.
Например, если в последовательности встречается A, вероятность преобразования всей последовательности увеличивается на 2%.
Если A-B-C встречается в комбинации, то вероятность преобразования возрастает на 13%
Если встречается Z-A, вероятность преобразования возрастает на 8%.
Как мне сделать такой стол —
Sno Sub-sequence probabilty_of_conversion
1 A 2%
2 B 1%
3 C 4%
......
4 A-B-C 13%
5. Z-A 8%
Комментарии:
1. как вы вычисляете эти вероятности? Я имею в виду, как вы приходите к «А» -> 2 ? вы считаете количество совпадений в каждом слове? и делится на количество символов во всех словах? а как насчет 2-х длинных последовательностей? вы считаете количество пар? и что с того?=
2. в приведенном выше примере всякий раз, когда встречается A-B-C-D, вероятность преобразования составляет 50%, так как в этих данных из двух случаев, когда оно встречалось, оно было преобразовано только один раз.
3. Возможно, вы захотите взглянуть на модуль itertools , а конкретно раздел «комбинаторная итераторы», поскольку если «А-Б-в», преобразующий вы хотите увеличить вероятность того, что «А», «А-Б», «В-С» и «А-Б-С», если я понимаю вашу проблему правильно.
4.
bayesian
В этом вопросе нет ничего (удаление тега). Вопрос запрашивает код для вычисления условных частот , что простоstatistics
.5. Давайте поговорим об
A
этом , это содержится в данных sno [1, 2, 3, 4, 6, 7, 8], и преобразуется только на [1, 3, 7], поэтому вероятность преобразованияA
составляет 3/7 или 42,86%. Это правильный способ рассчитать вероятность подлодки?
Ответ №1:
Что-то вроде этого:
import pandas as pd
# input data
input_ = [('A-B-C-D-E-B-A', 1), ('A-B-C-D', 0), ('A-B-C-D', 1),
('D-E-H-I-A', 0), ('Z', 0), ('A-Z', 0),
('F-E-T-H-S-A-T-J-F-E-D-E-S-X-G-N-N-K-L-D', 1),
('H-S-A-T-J-F-E', 0)]
input_ = pd.DataFrame(input_, columns=['sequence', 'conversion'])
# generate sub-sequences
def get_sub_sequences(sequence):
total = len(sequence)
for i in range(total):
for j in range(i 1, total 1):
yield sequence[i:j]
# populate sub-sequences
sub_sequences = []
for sequence in data.sequence:
for sub_sequence in get_sub_sequences(sequence.split('-')):
sub_sequence = '-'.join(sub_sequence)
if sub_sequence not in sub_sequences:
sub_sequences.append(sub_sequence)
sub_sequences = sorted(sub_sequences, key=len)
# populate probabilities
probabilities = []
for sub_sequence in sub_sequences:
values = []
for row in data.itertuples():
if sub_sequence in row.sequence:
values.append(row.conversion)
probability = round((sum(values) / len(values) * 100))
probabilities.append(f'{probability}%')
# output data
output = pd.DataFrame(zip(sub_sequences, probabilities),
columns=['sub_squence', 'probability'])
output
Ожидаемый Результат:
Комментарии:
1. Этот ответ выглядит хорошо! У меня действительно есть небольшой вопрос. Это не очень эффективно для большого набора данных, есть ли способ использовать параллельную обработку для обработки данных ?