2016-09-16 2 views
0

Я пытаюсь извлечь столбец из моей базы данных, применить преобразование и создать новый столбец с результатами.Python sqlite3 'executemany' не успешно обновляет мою базу данных

Я в конечном счете хочу сохранить локальную переменную 'new_proba' (которая имеет длину 740, такую ​​же длину, что и моя база данных) в качестве нового столбца, называемого «pred_proba_tplus1». Из чтения this thread я узнал, что функция UPDATE ожидает кортеж.

Я создал список «» идентификаторы, который соответствует столбец IndexID в базе данных, а затем заархивированы его с «new_proba», чтобы создать кортеж, который выводит «(0.56298709097028454, 0), (0,54392926856501334, 1),» и т.д.

Функция, приведенная ниже, не вызывает никакой ошибки, но создает только столбец «preview_proba_tplus1» и не заполняет никаких значений, которые я ожидал бы от c.executemany(), - я остался с новый столбец, заполненный значениями NULL. Это заставляет меня думать, что что-то не так с оператором WHERE, т. Е. По какой-то причине не соответствует столбцу indexID переменной ID, несмотря на то, что числа одинаковы.

Любое понимание было бы чрезвычайно оценено.

def update_class_proba(path): 
    conn = sqlite3.connect(path) 
    c = conn.cursor() 
    cursor = c.execute('SELECT text, indexID FROM reuters_test_X') 
    all_rows = cursor.fetchall() 
    X = vect.transform(x[0] for x in all_rows) 
    new_proba = list(clf.predict_proba(X)[:,1]) 
    IDs = list(np.arange(0, 740, 1)) 
    new_proba_tuple = list(zip(new_proba,IDs)) 
    c.execute('ALTER TABLE reuters_test_X ADD COLUMN predict_proba_tplus1 REAL') 
    c.executemany('UPDATE reuters_test_X SET predict_proba_tplus1=? WHERE indexID=?', new_proba_tuple) 
    conn.commit() 
    conn.close() 
+0

Вы _sure_, что 'new_proba_tuple' содержит нужные данные в нужном формате? Вы даете несколько примеров содержимого в третьем абзаце в своем сообщении, но формат кажется странным - он заключен в кавычки (подразумевая, что это фактически строка), и это __not__ заключено в квадратные скобки (подразумевая, что это не список). –

+0

Спасибо за ответ. Это формат вывода (я добавил цитату в последнем сообщении: [(0.56298709097028454, 0), (0.54392926856501334, 1), (0.58659573866520598, 2) и т. Д. – BernoulliSanders

+0

Попробуйте выполнить один оператор 'execute' с одной строкой данных и Посмотрите, работает ли это. –

ответ

0

Эти значения не являются равными float; это numpy.float64, с которыми база данных не справляется.

Преобразование значения в обычный float и int как это:

new_proba = list(float(z) for z in clf.predict_proba(X)[:,1]) 
IDs = list(int(zz) for zz in np.arange(0, 740, 1)) 
Смежные вопросы