91 lines
2.5 KiB
Python
91 lines
2.5 KiB
Python
import csv
|
|
import io
|
|
import re
|
|
|
|
def items_csv_to_dict(items_csv_reader):
|
|
items = []
|
|
headers = []
|
|
|
|
# get headers and items
|
|
for key, row in enumerate(items_csv_reader):
|
|
if key == 0:
|
|
headers = row
|
|
else:
|
|
item = { 'attributes': [] }
|
|
|
|
# ensure that the b param is formatted correctly
|
|
if len(re.findall(".", row[len(headers) - 1])) >= 3:
|
|
for key, col in enumerate(headers):
|
|
if key == 0:
|
|
item[col] = row[key]
|
|
if key == 2:
|
|
# make sure passage id exists
|
|
if row[key]:
|
|
item['passage_id'] = row[key]
|
|
# b param - tmep fix! use irt model b param for proper reference
|
|
elif key == len(headers) - 1:
|
|
item['b_param'] = row[key]
|
|
elif key > 2 and key < len(headers) - 1:
|
|
item['attributes'].append({
|
|
'id': col,
|
|
'value': row[key],
|
|
'type': 'metadata'
|
|
})
|
|
|
|
items.append(item)
|
|
|
|
return items
|
|
|
|
def solution_to_file(buffer, total_form_items, forms):
|
|
wr = csv.writer(buffer, dialect='excel', delimiter=',')
|
|
|
|
# write header row for first row utilizing the total items all forms will have
|
|
# fill the rows with the targets and cut score then the items
|
|
header = ['status']
|
|
|
|
for result in forms[0].tif_results:
|
|
header += [f'tif @ {round(result.theta, 2)}']
|
|
|
|
for result in forms[0].tcc_results:
|
|
header += [f'tcc @ {round(result.theta, 2)}']
|
|
|
|
header += ['cut score'] + [x + 1 for x in range(total_form_items)]
|
|
wr.writerow(header)
|
|
|
|
# add each form as row to processed csv
|
|
for form in forms:
|
|
row = [form.status]
|
|
|
|
for result in form.tif_results + form.tcc_results:
|
|
row += [f'target - {result.value}\nresult - {round(result.result, 2)}']
|
|
|
|
# provide generated items and cut score
|
|
row += [round(form.cut_score, 2)] + [item.id for item in form.items]
|
|
wr.writerow(row)
|
|
|
|
buff2 = io.BytesIO(buffer.getvalue().encode())
|
|
|
|
return buff2
|
|
|
|
def error_to_file(buffer, error):
|
|
wr = csv.writer(buffer, dialect='excel', delimiter=',')
|
|
wr.writerow(['status'])
|
|
wr.writerow([error.args[0]])
|
|
|
|
return io.BytesIO(buffer.getvalue().encode())
|
|
|
|
def key_to_uuid(key):
|
|
return re.split("_", key)[0]
|
|
|
|
def solution_items(variables, solver_run):
|
|
form_items = []
|
|
|
|
for v in variables:
|
|
if v.varValue > 0:
|
|
item_id = v.name.replace('Item_', '')
|
|
item = solver_run.get_item(item_id)
|
|
# add item to list and then remove from master item list
|
|
form_items.append(item)
|
|
|
|
return form_items
|