Панды применяются к пользовательской функции приводит к ошибке сегментации - PullRequest
0 голосов
/ 30 июня 2018

Я применяю пользовательский метод к кадру данных, используя метод apply. Когда передается информационный фрейм с более чем 2 строками (кортежами), это приводит к тому, что ядро ​​завершает работу (прерывается) в блокноте jupyter. При запуске того же самого на терминале это приводит к Ошибка сегментации .

Метод работает для отдельной строки или для 2 строк, но не более того. Оба вызова ниже работают с пользовательской функцией myTrial.

myTrial(pd.ix[3,:])
newPD2 = pd.head(2).apply(myTrial, axis=1)

Но это приводит к следующей ошибке.

newPD2 = pd.head(3).apply(myTrial, axis=1)
The kernel appears to have died. It will restart automatically.

Метод myTrial использует функцию выравнивания pairwise2.align.globalmx из BioPython и другие встроенные функции Python. Я предоставляю функцию ниже:

У меня есть фрейм данных с 10000 строк и 8 столбцов. Я подаю в суд на сервер с 256 ГБ оперативной памяти.

Функция выглядит следующим образом

from Bio import pairwise2
def myTrial(pdf):
    source = pdf['source']
    targ = pdf['target']

    if source == targ:
        pdf['sourceAlign'] = source
        pdf['targetAlign'] = source
        pdf['joint'] = source

        return pdf

    alignments = pairwise2.align.globalmx(source, targ,1,-0.5)
    summaDict = dict()
    for item in alignments:
        lenList = list()
        i = 0
        while i < len(item[0]):
            con = 0
            while item[0][i] == item[1][i]:
                con += 1
                i += 1

            if con == 0:
                i += 1
            else:
                lenList.append((con,item[0][i-con:i],item))
                con =0

        summa = 0
        for thing in lenList:
            summa += (thing[0]*thing[0])
        try:
            summaDict[summa].append(lenList)
        except:
            summaDict[summa] = list()
            summaDict[summa].append(lenList)
    stuff = sorted(summaDict.keys(),reverse=True)[0]

    if len(summaDict[stuff]) > 1:
        print(source,targ,summaDict[stuff])

    words = summaDict[stuff][0][0][2]

    jointWord = ''
    for inda in range(len(words[0])):
        if words[0][inda] == words[1][inda]:
            jointWord += words[0][inda]
        else:
            if words[0][inda] != '-':
                jointWord += 'DEL('+words[0][inda]+')'
            if words[1][inda] != '-':
                jointWord += 'INS('+words[1][inda]+')'

    pdf['sourceAlign'] = words[0]
    pdf['targetAlign'] = words[1]
    pdf['joint'] = jointWord

    return pdf

Фрейм данных выглядит следующим образом

type |  source |    props | target |    subtype |   p0 |    p1 |    p2 |    p3 |    p4
        0 | ADJ |   najprzytulniejszy | [NEUT, INS, SG] |   najprzytulniejszym |    NaN |   NEUT |  INS |   SG |    None |  None
        1 | ADJ |   sadystyczny |   [MASC, DAT, SG] |   sadystycznemu | NaN |   MASC |  DAT |   SG |    None |  None
        2 | V | wyrzucić |  [FUT, 2, SG] |  wyrzucisz | NaN |   FUT |   2 | SG |    None |  None
        3 | N | świat | [ACC, SG] | świat | NaN |   ACC |   SG |    None |  None |  None
        4 | N | Marsjanin | [INS, PL] | Marsjanami |    NaN |   INS |   PL |    None |  None |  None

Вывод на консоль также не является справкой:

[I 19:16:45.709 NotebookApp] Kernel restarted: 604e9df5-6630-4a12-9c13-e9d7a4835da2
[I 19:17:00.710 NotebookApp] KernelRestarter: restarting kernel (1/5)
WARNING:root:kernel 604e9df5-6630-4a12-9c13-e9d7a4835da2 restarted

В чем может быть причина?

1 Ответ

0 голосов
/ 30 июня 2018

Функция Bio.pairwise2.globalmx вызывает segfault, который находится вне контроля Pandas. Пожалуйста, посмотрите Biopython pairwise2 для строк не ASCII для решения о том, как исправить лежащий в основе segfault.

...