Найти вероятность преобразования последовательностей для подпоследовательностей и их комбинаций

#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. Этот ответ выглядит хорошо! У меня действительно есть небольшой вопрос. Это не очень эффективно для большого набора данных, есть ли способ использовать параллельную обработку для обработки данных ?