Заполнение пропущенных слотов нулями, получение кумулятивной суммы, а затем убывание этой серии на 0,99 - PullRequest
0 голосов
/ 26 февраля 2020

Это очень итеративная задача, которая занимает несколько часов в SAS. Я пытаюсь сделать это ПИФОНИЧЕСКИ, но индексы продолжают меня преследовать.

Я классифицировал, забил набор статей из inte rnet с их тематической валентностью (проприетарной; semioti c -семантикой, а не дистрибутивной) -семантика через токен-случайность). Данные, здесь один идентификатор и топи c, содержат более 3000 уникальных идентификаторов (статьи с nwords, каждое), каждый из которых содержит до 75 взвешенных тем.

Каждый слот представляет дециль последовательной клавиши pid-topi c, а вес - это "суммарная валентность" этого слота. В каждом слоте может быть несколько тем, в то время как сами оригинальные слоты содержат только одну взвешенную топи c. Так что это действительно проблема разделения-агг-применения-объединения, ставящая меня в тупик.

pslot = int(round(slot / nwords) * 100),2)

ИСПЫТАТЕЛЬНЫЕ ДАННЫЕ (у меня 3000 статей с ~ 40 + темами где-то по всей длине).

У меня есть только несколько «забитых» слотов на id-topi c, но вес представляет его валентность в этом «дециле токенов в статье».

Я хочу заполнить недостающие слоты с нулями, то есть каждая id-topi c должна иметь 10 pslots (100 с процентными слотами) с весом. По сути, я иду сквозь каждую статью от начала до конца как мера каждой topi c ' s последовательная валентность в каждой «децилированной зоне» в каждой статье.

Транспонированный, например, для кластеризации, запись корпуса с актуальной инерцией будет выглядеть так:

id1, pslot, TI_Asia, TI_Britain, ..., TI_Women
x    0       ##.##     ##.##            ##.##
x    1       ##.##     ##.##            ##.##
x    2       ##.##     ##.##            ##.##
...
x    8       ##.##     ##.##            ##.##
x    9       ##.##     ##.##            ##.##
...
z    0       ##.##     ##.##            ##.##
z    1       ##.##     ##.##            ##.##
z    2       ##.##     ##.##            ##.##
...
z    7       ##.##     ##.##            ##.##
z    8       ##.##     ##.##            ##.##
z    9       ##.##     ##.##            ##.##

Я направляюсь в многовариантная кластеризация последовательности k-формы с использованием кросс-корреляции в качестве моей метрики расстояния c (здесь это будет topi c-to-topi c корреляция последовательности, по существу, автокорреляция во временных рядах lin go). Мне нужен каждый д ocument, чтобы отразить последовательный эффект каждого topi c в каждом документе в стандартизированном местоположении (pslot может быть децилями длины, процентилями и т. д., но так как wordcount сильно варьируется по всему корпусу (nwords = 57-10000)

Затем я хочу сформировать TI, актуальную инерцию, которая представляет последовательную актуальную валентность для этой топики c в этом документе, который начинается с 0-9. Это означает, что я должен заполнить недостающие pslots (те, которые не в 0-9), это нулевой вес, а затем сформировать кумулятивную сумму, которую я могу уменьшить на 1/10-й за каждый pslot.

Я могу только темы, набранные слотами , У меня есть общее расположение слотов в документе от разделения текста каждой статьи по фразе. Но мне нужно представить ВСЕ СЛОТЫ, чтобы сформировать стандартизированную последовательность из 10 (100 в случае процентилей), поскольку корпус имеет сильно изменяющиеся счетчики слов среди своих членов.

Вставка строк в мой pandas массив данных почти невозможна, когда Я пытаюсь повторить.

MY CODE, that fails with ambiguous truth errors;

РАЗДЕЛ 4 - АКТУАЛЬНАЯ ИНЕРЦИЯ

decay = .99 # decay factor for topical_inertia; 1 - 1/100
topic_list = SandS_df['topic'].unique().tolist() # get list of article's unique topics

# build topical_intertia
cols = ['']
topical_inertia_df = SandS_df

for tcount, tkn in enumerate(topic_list): # iterate through unique topics
    inertia = 0.0 # topical_inertia
    topic_number = 0 # track topic #'s slotted

    topic_df = SandS_df.loc[SandS_df['topic'] == tkn] # filter SandS_df where topic==tkn

    ts = list(topic_df['pslot']) # list of topic pslot
    tw = list(topic_df['weight']) # list topic weight
    tp = list(topic_df['pid']) # list topic pid

    slt = ts.pop(0) # first pslot from topic-pid
    wgt = tw.pop(0) # first weight from topic-pid
    pid = tp.pop(0) # first pid from topic-pid

    for i in range(100):
        ***if i != slt:***
            inertia = max(round(inertia*decay,8),0)
            full_slots.extend([(pid,topic_number,tkn,inertia)])
            topic_number+=1 # increment topics pslotted
        else:
            inertia = max(round(inertia + wgt,8),0) # negative inertia not possible
            full_slots.extend([(pid,slt,tkn,inertia)])
            topic_number+=1
            try: # check for last topic...
                slt = ts.pop(0) # pop pslot topic
                wgt = tw.pop(0) # pop weight for topic
                pid = tp.pop(0) # pop pid for topic
            except:
                continue

    # ...no more topics; topical_inertia decreases
    if topic_number < 100:
        for j in range(topic_number,100): # pslotted topic_number-99
            inertia = max(round(inertia*decay,8),0) # negative inertia not possible
            full_slots.extend([(pid,j,tkn,inertia)])

Другой угол? Я пытался взять этот список, а затем прочитать его в новом заполненном кадре данных, но «неоднозначный» слот i == slt или i! = Все еще убивает меня.

if i != slt:

The essential choice at every step?
PSEUDO-CODE
if i != slt: # pslot is occupied; add weight to TI
        add weight to TI
else: # i has no weighted topics; decay I by /10th
        decay TI by 1/10th

This problem boils down to my not being able to add a row in a dataframe while iterating through that dataframe.

ВЫХОД ДОЛЖЕН СМОТРЕТЬ, КАК ЭТО (это последовательность добавления или затухания, чья «последовательность-форма» станет входом для моделей кластеризации фигур).

pid,topic,pslot,new_weight/existing-weight,TI
1, Asia, 0, 1, 1
1, Asia, 1, 0, .9
1, Asia, 2, 0, .8
1, Asia, 3, 0, .7
1, Asia, 4, 2, 2.7
1, Asia, 5, 1, 3.7
1, Asia, 6, 0, 3.33
1, Asia, 7, 0, 3.00
1, Asia, 8, 1, 4.00
1, Asia, 9, 4, 9.00
1, Buying-Selling, 0, 0, 0
1, Buying-Selling, 1, 3, 3
1, Buying-Selling, 2, 0. 2.7
1, Buying-Selling, 3, 0, 2.43
1, Buying-Selling, 4, 5, 7.43
1, Buying-Selling, 5, 7, 12.43
1, Buying-Selling, 6, 0, 11.19
1, Buying-Selling, 7, 9, 20.19
1, Buying-Selling, 8, 0, 18.17
1, Buying-Selling, 9, 0, 16.35
...

Пожалуйста, помогите. Я надеюсь, что предоставил достаточно информации. Я также попытался создать пустой фрейм данных с уникальными pid-темами, создать 100 фиктивных записей qwith weight = 0 и pslto с 0-99, а затем выполнить внутреннее соединение этого с помощью фрейма данных со слотами. Опять не удача Моя неопытность с индексами Pandas является настоящим препятствием!

Я успешно сделал это в SAS v9.1.3, (время выполнения 3 часа), но мой gr asp из Python - Pandas низок, и групповая индексация продолжает путать меня с ошибками, за которыми я следую часами безрезультатно.

Моя настоящая проблема? Несмотря на то, что итерации по группам не совсем PYTHONI C, проверка для сюжета == al oop от 0 до 9 позволяет узнать, есть ли готовый вес для добавления, в отличие от нуля для вставки, я получаю " неоднозначная правда "используйте ошибки .item (), .bool, .any ()!

...