py.user.next
опиши задачу, пришли файлы входящий/выходящий
Хорошо. Изначально у меня есть n файлов типа
Data.xls. Файлы содержат название радионуклида, год измерения и, собственно, значение измерения. Данные таблицы не совпадают по размерам, т.е. количество радионуклидов и количество измерений разнится от файла к файлу.
Задача 1. Получить на выходе файл, в котором первая страница будет идентична содержанию входного файла, а остальные страницы в заголовке имеют имя радионуклида и содержат расчеты. Предположим, что имеется i радионуклидов и j лет измерений. Назовем измеряемую величину А. Имя радионуклида, соответствующее имени страницы, обозначим индексом r. Тогда необходимо найти отношение А(i)/А(r)
Решение:
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')
Файл, получаемый на выходе , с ним я и работаю в коде, приведенном ранее, т.к. второй код решает вторую задачу, появившуюся позже.
Задача 2:
Для каждого нуклида найти “Rating”. Для этого по каждому нуклиду (по каждой странице):
1) посчитать среднее значение А(i)/А(r)
2) посчитать квадраты разности ^2
3) посчитать сумму квадратов разности (по строке) ∑^2
4) посчитать среднеквадратичное отклонение: sqrt{ (∑^2) / (число измерений * (число измерений - 1))}
5) перевести в проценты среднеквадратичное отклонение: (среднеквадратичное отклонение) / (среднее значение) * 100
6) закончив обработку страницы, посчитать сумму квадратов разности по всем нуклидам (по столбцу): ∑∑^2. Записать это значение в “хвост” колонки с одинарной суммой и присвоить это же значение на первую страницу файла соответствующему нуклиду в добавленную колонку “Rating”
Мое корявенькое решение:
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')
Получаемый мною файл