Форум сайта python.su
Доброго времени суток!
Проблема следующая. Нижепредставленный код работает довольно корректно до момента вычисления переменной total. В файле с результатами total отличается как в большую, так и в меньшую сторону от истинного значения суммы. Чем это может быть вызвано?
import xlrd import xlwt import math from xlutils.copy import copy book1 = xlrd.open_workbook("d:/results_test2_lo.xls", on_demand=True, formatting_info=True) calc_fin = copy(book1) rep_n = book1.sheet_by_index(1) j = 1 for i in rep_n.col_values(j, 1): rep_n = book1.sheet_by_index(j) rn = calc_fin.get_sheet(j) g = 1 total = 0 for c in rep_n.col_values(g, start_rowx=1): s = 0 sum = 0 v = 1 for a in rep_n.row_values(v, start_colx=1): vek = rep_n.row_values(g)[v] if type(vek) == float: s += 1 sum = sum + vek else: pass v += 1 if s == 0: average = "zero!" else: average = sum / s rn.write(g, v, average) e = 1 summa = 0 for b in rep_n.row_values(e, start_colx=1): vek = rep_n.row_values(g)[e] if type(vek) == float: razn = (vek - average) ** 2 summa = summa + razn total = total + summa else: razn = '-' rn.write(g, v+e, razn) e += 1 rn.write(g, v+e, summa) if s == 0: otklon = 'zero!' elif summa == 0: otklon = '-' else: s_s = s * (s - 1) kor = summa / s_s otklon = math.sqrt(kor) rn.write(g, v+e+1, otklon) if average == 'zero!' or otklon == 'zero!' or otklon == '-': percent = '-' elif average == 0: percent = 0 else: percent = (otklon / average)*100 rn.write(g, v+e+2, percent) g += 1 rn.write(g, v+e, total) j += 1 calc_fin.save('d:/results_test4_lo.xls')
Офлайн
angelineНадо провести отладку: надо просто выводить на экран все значения total, делая паузу каждый раз (через time.sleep() или input() ) и следить, когда total становится неправильным. Ну, и не забывать вместе с total выводить и другие переменные, чтобы и их состояние знать в тот момент.
Чем это может быть вызвано?
for i in rep_n.col_values(j, 1): rep_n = book1.sheet_by_index(j)
>>> n = 3 >>> >>> for i in range(n): ... n = i - 1 ... print(i) ... 0 1 2 >>> for i in range(n): ... n = i - 1 ... print(i) ... 0 >>> for i in range(n): ... n = i - 1 ... print(i) ... >>>
Отредактировано py.user.next (Ноя. 27, 2016 03:07:22)
Офлайн
py.user.next
надо просто выводить на экран все значения total
py.user.next
Тут ещё плохой стиль виден
Офлайн
angelineНадо распутать код, в этом и проблема: если не можешь понять, что в переменной на каждом шаге цикла, это из-за запутанности кода, а не из-за сложности задачи. Сложная задача решается простыми, ясными алгоритмами.
Подумала, что, возможно, есть что-то еще, что мне (как человеку, занимающемуся питоном 1,5 недели) не видно.
angelineНу, это признак того, что код поплыл (называют это “пахнущий код”, “код с душком”). Не должно быть случайных строк в коде.
По сути строка в начале кода “rep_n = book1.sheet_by_index(1)” мне не нужна, и добавлена она только для того, чтобы “успокоить” компилятор
angelineВот опиши задачу от и до.
Как на Ваш взгляд возможно обойти эту проблему изящнее?
angelineЛибо там число должно быть, либо строка, а вот когда-то строка, а когда-то число - это плохой стиль. Можно туда засунуть число, которое не может быть средним арифметическим (отрицательное или ноль обычный).if s == 0: average = "zero!" else: average = sum / s
Отредактировано py.user.next (Ноя. 27, 2016 14:00:01)
Офлайн
py.user.next
опиши задачу, пришли файлы входящий/выходящий
import xlrd import xlwt from xlutils.copy import copy book = xlrd.open_workbook("d:/Data.xls", on_demand=True, formatting_info=True) data = book.sheet_by_index(0) calc = copy(book) j = 1 for i in data.col_values(j, 1): r_name = data.row_values(j)[0] sheet = calc.add_sheet('%s' % r_name, cell_overwrite_ok=True) r = 1 for t in data.col_values(r, 1): r_name = data.row_values(r)[0] sheet.write(r, 0, r_name) r = r + 1 d = 1 for p in data.row_values(d, 1): m = 1 god1 = data.row_values(0)[d] sheet.write(0, d, god1) act_r1 = data.row_values(j)[d] for k in data.col_values(m, 1): if act_r1 == '<NPI': vek1 = 'zero!' sheet.write(m, d, vek1) m += 1 elif act_r1 == '-': vek1 = '-' sheet.write(m, d, vek1) m += 1 else: act_r1 = float(act_r1) act1 = data.row_values(m)[d] if act1 == '<NPI': #while m <= 45: vek1 = 0 elif act1 == '-': vek1 = '-' else: act1 = float(act1) vek1 = act1 / act_r1 sheet.write(m, d, vek1) #print m, vek1 #time.sleep(2) m += 1 d = d + 1 j = j + 1 calc.save('d:/results_111.xls')
import xlrd import xlwt import math from xlutils.copy import copy book1 = xlrd.open_workbook("d:/results_11.xls", on_demand=True, formatting_info=True) calc_fin = copy(book1) rep_n = book1.sheet_by_index(1) j = 1 for i in rep_n.col_values(j, 1): rep_n = book1.sheet_by_index(j) rn = calc_fin.get_sheet(j) g = 1 total = 0 for c in rep_n.col_values(g, start_rowx=1): s = 0 sum = 0 v = 1 for a in rep_n.row_values(v, start_colx=1): vek = rep_n.row_values(g)[v] if type(vek) == float: s += 1 sum = sum + vek else: pass v += 1 if s == 0: average = "zero!" else: average = sum / s rn.write(g, v, average) rn.write(0, v, 'average A') e = 1 summa = 0 for b in rep_n.row_values(e, start_colx=1): vek = rep_n.row_values(g)[e] god = str(rep_n.row_values(0)[e]) if type(vek) == float: razn = (vek - average) ** 2 summa = summa + razn total = total + summa else: razn = '-' rn.write(g, v + e, razn) rn.write(0, v + e, 'A(i)/A(r), %s' % god) e += 1 rn.write(g, v + e, summa) rn.write(0, v + e, 'Sum A(i)/A(r)') if s == 0: otklon = 'zero!' elif summa == 0: otklon = '-' else: s_s = s * (s - 1) kor = summa / s_s otklon = math.sqrt(kor) rn.write(g, v + e + 1, otklon) rn.write(0, v + e + 1, 'Mean square deviation') if average == 'zero!' or otklon == 'zero!' or otklon == '-': percent = '-' elif average == 0: percent = 0 else: percent = (otklon / average) * 100 rn.write(g, v + e + 2, percent) rn.write(0, v + e + 2, '%') g += 1 rn.write(g+1, v + e, total) rn_1 = calc_fin.get_sheet(0) rn_1.write(0, v, 'Rating') rn_1.write(j, v, total) j += 1 calc_fin.save('d:/results_22.xls')
Отредактировано angeline (Ноя. 27, 2016 18:51:48)
Офлайн
Спасибо. Основной вопрос темы снялся. Проблема сумматора оказалась элементарной, я не то суммировала
Офлайн
angelineВот там в файлах вместо “-” должна быть пустота, просто пустота. В питоне - это None. А вместо “zero!” должен быть ноль обычный.if s == 0: otklon = 'zero!' elif summa == 0: otklon = '-' else:
angelineЭто магическая помощь. Есть такая хрень. Ну, типа чудо, как его называют. Ты куда-то приходишь, тебе что-то желают и у тебя раз и всё получается и рассасываются все проблемы.
Проблема сумматора оказалась элементарной
Отредактировано py.user.next (Ноя. 28, 2016 05:23:21)
Офлайн
py.user.nextПотому что мне нужно провести сравнение измеренений по этому радионуклиду с измерениями по другим и найти соотношения. Именно поэтому на листе с названием радионуклида в строке с его названием стоят либо единицы, либо прочерки, если измерений не было.
почему у тебя на листе с названием радионуклида перечислены все остальные радионуклиды
py.user.nextНе совсем так с точки зрения моей задачи, но это действительно мелочи
Вот там в файлах вместо “-” должна быть пустота, просто пустота. В питоне - это None. А вместо “zero!” должен быть ноль обычный.
py.user.nextЧто Вы вкладываете в понятие “выравнивание”? Если Вы имеете в виду приведение всех входных таблиц к единому размеру, то этого не требуется на мой взгляд, т.к. входные таблицы я не смешиваю. Все безобразие, которое творится в файлах results_111.xls и results_22.xls, родилось на основе одной входной таблицы Data.xls
А потом уже, когда эти файлы будут выровнены…
Traceback (most recent call last):
File “Dpyto_p/try5.5.py”, line 12, in <module>
sheet = calc.add_sheet('%s' % r_name, cell_overwrite_ok=True)
File “D:\python\lib\site-packages\xlwt\Workbook.py”, line 368, in add_sheet
raise Exception(“invalid worksheet name %r” % sheetname)
Exception: invalid worksheet name u''
Process finished with exit code 1
Отредактировано angeline (Ноя. 28, 2016 20:50:44)
Офлайн
Офлайн
py.user.nextБлагодарю. Буду разбираться…
Перевёл первый скрипт на функции.
Офлайн