#!/usr/bin/env python # -*- coding:utf-8 -*- ''' Step 2 ''' from __future__ import print_function from base import Lo, create_csv, TARGET_DIR import os import csv import sys los = Lo() xmodels = { 'IMSf': {}, 'IMSD': {}, 'IMHf': {}, 'IMHD': {}, 'IFSf': {}, 'IFSD': {}, 'IFHf': {}, 'IFHD': {}, 'CMSf': {}, 'CMSD': {}, 'CMHf': {}, 'CMHD': {}, 'CFSf': {}, 'CFSD': {}, 'CFHf': {}, 'CFHD': {}, 'PMSf': {}, 'PMSD': {}, 'PMHf': {}, 'PMHD': {}, 'PFSf': {}, 'PFSD': {}, 'PFHf': {}, 'PFHD': {}, } ''' แก้ตรงนี้ >> RANK_ORDER << ถ้าจะเพิ่ม rank ใส่อะไรก็ใส่ไปตามลำดับ ''' RANK_ORDER = ['1', '2', '3', '4'] fs = ('Case1_LS.csv', 'Case1_Gender.csv', 'Case1_Level.csv', 'Case1_SciF.csv') def process_s2_data(): sum_result = {} rank_result = {} step, rank = '', '' for i in fs: f_name = '%s-result.csv' % i # print(f_name) with open(os.path.join(TARGET_DIR, f_name), 'rb') as f: rows = csv.reader(f) for r in rows: if r[0] in ('rank_no', 'All Result'): step = r[0] rank = r[1] continue if step == 'rank_no': if r[0] not in rank_result: rank_result[r[0]] = {} rank_result[r[0]][rank] = r[1].split(',') elif step == 'All Result': if not r[0]: continue if r[0] in sum_result: # print('exists:', r[1], '|', step, '|', rank) pass sum_result[r[0]] = r[1].split(',') # print(rank_result['C'].keys()) return { 'sum': sum_result, 'rank': rank_result } def produce_s2_part1(sum_result): # create xxxx-1.csv for ii in xmodels.keys(): rows = [] rows.append([ii, ]) for i in ii: if i not in sum_result: continue rows.append([i, ','.join(sum_result[i])]) _f = '%s-1.csv' % ii create_csv(_f, rows, directory='part2') def produce_s2_part2(rank_result): # create xxxx-2.csv for ii in xmodels.keys(): rows = [] for rank in RANK_ORDER: # print(ii, ':rank:', rank) rows.append(['Rank#%s' % rank, 'rank', rank]) for i in ii: if i not in rank_result: continue if rank not in rank_result[i]: continue rows.append([i, ','.join(rank_result[i][rank])]) _f = '%s-2.csv' % ii create_csv(_f, rows, directory='part2') def process_lo_weight(): los = {} for i in fs: f_name = '%s-output.csv' % i with open(os.path.join(TARGET_DIR, f_name), 'rb') as f: rows = csv.reader(f) for r in rows: _los = r[1].split(',') for _l in _los: if _l not in los: los[_l] = {} if r[0] in los[_l]: # print('exists:', _l, ':', r[0], ' > ') # los[_l]['%s2' % r[0]] = r[2:] pass los[_l][r[0]] = r[2:] return los def produce_part3(sum_result, lo_weight): # produce part3 for ii in xmodels.keys(): rows = [] lo_xmodels = set() for i in ii: if i in sum_result: lo_xmodels = lo_xmodels.union(set(sum_result[i])) lo_xmodels = sorted(list(lo_xmodels)) for l in lo_xmodels: ## build container to store sum of all weight lo_sum = [0 for k in xrange(0, 25)] if l not in lo_weight: continue for i in ii: if i not in lo_weight[l]: continue lo_sum = [ float(x) + float(y) for x, y in zip(lo_weight[l][i][9:], lo_sum)] rows.append([l] + lo_sum) _f = '%s-3.csv' % ii create_csv(_f, rows, directory='part2') def main(*argv): _r = process_s2_data() _lw = process_lo_weight() produce_s2_part1(_r['sum']) produce_s2_part2(_r['rank']) produce_part3(_r['sum'], _lw) if __name__ == '__main__': if len(sys.argv) > 1: main(sys.argv[1:]) else: main()