Это очень итеративная задача, которая занимает несколько часов в 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 ()!