Попытка рассчитать процент в Python sqlite3 на основе значений в таблице - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь создать процент, основанный на двух факторах (для программы подсчета монет), где я должен создать точность того, насколько хорошо люди считают монеты.Это рассчитывается путем получения общего количества сумок монет, которые они подсчитали, и общего количества сумок, которые они посчитали ПРАВИЛЬНО, в процентах от их общего количества.

В моей программе, если добровольцы введут правильный вес мешка с монетами для этой конкретной монеты, +1 добавляется к столбцу bags_correct И total_bags.Если вес неправильный, +1 добавляется к столбцу bags_incorrect, а также, опять же, к столбцу total_bags.

Я бы затем использовал этот c.execute("UPDATE volunteers SET bags_correct = bags_correct + 1, total_bags = total_bags + 1, total_bags_value = total_bags_value + (?), percentage = (bags_correct / total_bags)*100 WHERE name = (?)", (100, name)), чтобы попытаться вычислить процент (точность) но я получаю странные значения, такие как '0' или '400', это должен быть процент, то есть от 0% до 100%, но у меня возникают проблемы при этом.

Я пытался изменить realна integer но произошло то же самое

Я неправильно вычисляю это каким-либо образом?

conn = sqlite3.connect("volunteers.db")

c = conn.cursor()


c.execute("""CREATE TABLE volunteers (
           name text,
           bags_correct integer,
           bags_incorrect integer,
           total_bags integer,
           total_bags_value integer,
           percentage real
           )""")





####This is when NEW volunteers add their first bag of coins when they counted it CORRECTLY without weight error.

c.execute("INSERT INTO volunteers VALUES (?, ?, ?, ?, ?, ?)", (name, 1, 0, 
1, 100, 100))
conn.commit()


HOWEVER



####This is when NEW volunteers add their first bag of coins BUT it is INCORRECT

c.execute("INSERT INTO volunteers VALUES (?, ?, ?, ?, ?, ?)", (name, 0, 1, 
1, 100, 0))
conn.commit()



####This is when NON-NEW volunteers add their bag of coins if it's CORRECT, hence the UPDATE.

c.execute("UPDATE volunteers SET bags_correct = bags_correct + 1, total_bags = total_bags + 1, total_bags_value = total_bags_value + (?), percentage = (bags_correct / total_bags)*100 WHERE name = (?)", (100, name))
conn.commit()



####This is when NON-NEW volunteers add their bag of coins but it's INCORRECT.

c.execute("UPDATE volunteers SET bags_incorrect = bags_incorrect + 1, total_bags = total_bags + 1, total_bags_value = total_bags_value + (?), percentage = (bags_correct / total_bags)*100 WHERE name = (?)", (100, name))
conn.commit()

ПРИМЕЧАНИЕ: total_bag_value находится в пене.

1 Ответ

0 голосов
/ 14 сентября 2018

Я не уверен, правильно ли я понял ваши требования, но есть две вещи, которые я вижу неправильно в запросах на обновление.

  1. Вы пытаетесь обновить столбец и использоватьтот же столбец при вычислении значения для другого столбца в том же операторе SQL.Это неверноВ вашем первом операторе обновления, например, вы увеличиваете bags_correct и total_bags на 1, а затем делаете percentage = (bags_correct / total_bags) * 100.Здесь ваши сумки будут корректно обновляться, но ваш процент будет рассчитываться на основе предыдущих значений сумок, поскольку обновление фактически не применяется к БД, пока вы не совершите транзакцию.Вместо этого вы должны делать percentage = (bags_correct + 1/ total_bags + 1) * 100.

  2. Вторая проблема заключается в том, что все столбцы для сумок являются целыми числами, в то время как вы хотите выполнить деление поплавка.Процент, который вы рассчитываете, выполняет целочисленное деление, и поэтому всякий раз, когда bags_correct меньше total_bags, ваше деление автоматически рассчитывается как 0. Вместо этого вам нужно сделать то, что вам нужно привести столбцы в float (или впо крайней мере, числитель, который автоматически форсирует деление с плавающей точкой).Что-то вроде percentage = (CAST(bags_correct AS FLOAT) / CAST(total_bags AS FLOAT)) * 100.Если вы хотите сохранить процент как INT, вы можете преобразовать результат обратно в целое число, если хотите.

Надеюсь, это поможет.

...