Ejemplo n.º 1
0
def importation(file):

    try:
        wb = load_workbook(filename=file, read_only=True)

        mySession = {
            "attributes": [],
            "k_calculus": [
                {"method": "multiplicative", "active": True, "k": [], "GK": None, "GU": None},
                {"method": "multilinear", "active": False, "k": [], "GK": None, "GU": None},
            ],
        }

        for sheet in wb:
            myAttribut = {}
            ws = wb[sheet.title]  # ws is now an IterableWorksheet
            if sheet.title == "Multi attribute multilinear" or sheet.title == "Multi attribute multiplicative":
                continue

            myAttribut["name"] = ws["B2"].value
            myAttribut["unit"] = ws["B3"].value
            myAttribut["val_min"] = ws["B4"].value
            myAttribut["val_max"] = ws["B5"].value
            myAttribut["method"] = ws["B6"].value
            myAttribut["mode"] = ws["B7"].value
            myAttribut["checked"] = ws["B8"].value

            myAttribut["questionnaire"] = {}

            ligne = 3
            number = 0
            mesPoints = []

            while ws["C" + str(ligne)].value != None:
                mesPoints.append([ws["C" + str(ligne)].value, ws["D" + str(ligne)].value])
                ligne = ligne + 1
                number = number + 1

            myAttribut["questionnaire"]["points"] = mesPoints
            myAttribut["questionnaire"]["number"] = number

            mySession["attributes"].append(myAttribut)

        for sheet in wb:
            ws = wb[sheet.title]  # ws is now an IterableWorksheet
            if sheet.title != "Multi attribute multilinear" and sheet.title != "Multi attribute multiplicative":
                continue

            ligne = 2
            mesK = []

            while ws["C" + str(ligne)].value != None:

                mesK.append(
                    {
                        "ID": ws["A" + str(ligne)].value,
                        "ID_attribute": json.loads(ws["D" + str(ligne)].value),
                        "attribute": json.loads(ws["C" + str(ligne)].value),
                        "value": ws["B" + str(ligne)].value,
                    }
                )
                ligne = ligne + 1

            if sheet.title == "Multi attribute multilinear":
                mySession["k_calculus"][1]["k"] = mesK
                mySession["k_calculus"][1]["GK"] = ws["B" + str(ligne)].value

            elif sheet.title == "Multi attribute multiplicative":
                mySession["k_calculus"][0]["k"] = mesK
                mySession["k_calculus"][0]["GK"] = ws["B" + str(ligne)].value

            try:
                GU = {"U": None, "utilities": [], "k": mesK}

                GU["U"] = ws["B" + str(len(mesK) + 5)].value

                ligne = 2
                while ws["E" + str(ligne)].value != None:
                    utilityType = ws["E" + str(ligne)].value
                    if utilityType == None:  # we brake all
                        ligne = 2
                        break
                    ID_attribute = ws["D" + str(ligne)].value.replace("[", "").replace("]", "")
                    monAttribut = mySession["attributes"][int(ID_attribute)]

                    points = monAttribut["questionnaire"]["points"][:]
                    if monAttribut["mode"] == "normal":
                        points.append([monAttribut["val_max"], 1])
                        points.append([monAttribut["val_min"], 0])
                    else:
                        points.append([monAttribut["val_max"], 0])
                        points.append([monAttribut["val_min"], 1])

                    allUtilities = fit.regressions_under_list_form(points)
                    for myUtility in allUtilities:
                        if myUtility["type"] == utilityType:
                            GU["utilities"].append(myUtility)
                            break

                    ligne = ligne + 1

                if ligne != 2:  # If we have some utilityType function, ligne is different from 2
                    if sheet.title == "Multi attribute multilinear":
                        mySession["k_calculus"][1]["GU"] = GU

                    elif sheet.title == "Multi attribute multiplicative":
                        mySession["k_calculus"][0]["GU"] = GU

            except:  # if it doesn't worl because there is no U or utilities type
                pass

        os.remove(file)
        return {"success": True, "data": mySession}
    except Exception, err:
        os.remove(file)
        return {"success": False, "data": traceback.format_exc()}
Ejemplo n.º 2
0
def importation(file):

    try:
        wb = load_workbook(filename=file, read_only=True)

        mySession = {
            'attributes': [],
            'k_calculus': [{
                'method': 'multiplicative',
                'active': True,
                'k': [],
                'GK': None,
                'GU': None
            }, {
                'method': 'multilinear',
                'active': False,
                'k': [],
                'GK': None,
                'GU': None
            }]
        }

        for sheet in wb:
            myAttribut = {}
            ws = wb[sheet.title]  # ws is now an IterableWorksheet
            if sheet.title == "Multi attribute multilinear" or sheet.title == "Multi attribute multiplicative":
                continue

            myAttribut['name'] = ws['B2'].value
            myAttribut['unit'] = ws['B3'].value
            myAttribut['val_min'] = ws['B4'].value
            myAttribut['val_max'] = ws['B5'].value
            myAttribut['method'] = ws['B6'].value
            myAttribut['mode'] = ws['B7'].value
            myAttribut['checked'] = ws['B8'].value

            myAttribut['questionnaire'] = {}

            ligne = 3
            number = 0
            mesPoints = []

            while ws['C' + str(ligne)].value != None:
                mesPoints.append(
                    [ws['C' + str(ligne)].value, ws['D' + str(ligne)].value])
                ligne = ligne + 1
                number = number + 1

            myAttribut['questionnaire']['points'] = mesPoints
            myAttribut['questionnaire']['number'] = number

            mySession['attributes'].append(myAttribut)

        for sheet in wb:
            ws = wb[sheet.title]  # ws is now an IterableWorksheet
            if sheet.title != "Multi attribute multilinear" and sheet.title != "Multi attribute multiplicative":
                continue

            ligne = 2
            mesK = []

            while ws['C' + str(ligne)].value != None:

                mesK.append({
                    'ID':
                    ws['A' + str(ligne)].value,
                    'ID_attribute':
                    json.loads(ws['D' + str(ligne)].value),
                    'attribute':
                    json.loads(ws['C' + str(ligne)].value),
                    'value':
                    ws['B' + str(ligne)].value
                })
                ligne = ligne + 1

            if sheet.title == "Multi attribute multilinear":
                mySession['k_calculus'][1]['k'] = mesK
                mySession['k_calculus'][1]['GK'] = ws['B' + str(ligne)].value

            elif sheet.title == "Multi attribute multiplicative":
                mySession['k_calculus'][0]['k'] = mesK
                mySession['k_calculus'][0]['GK'] = ws['B' + str(ligne)].value

            try:
                GU = {'U': None, 'utilities': [], 'k': mesK}

                GU['U'] = ws['B' + str(len(mesK) + 5)].value

                ligne = 2
                while ws['E' + str(ligne)].value != None:
                    utilityType = ws['E' + str(ligne)].value
                    if utilityType == None:  #we brake all
                        ligne = 2
                        break
                    ID_attribute = ws['D' + str(ligne)].value.replace(
                        "[", "").replace("]", "")
                    monAttribut = mySession['attributes'][int(ID_attribute)]

                    points = monAttribut['questionnaire']['points'][:]
                    if monAttribut['mode'] == "normal":
                        points.append([monAttribut['val_max'], 1])
                        points.append([monAttribut['val_min'], 0])
                    else:
                        points.append([monAttribut['val_max'], 0])
                        points.append([monAttribut['val_min'], 1])

                    allUtilities = fit.regressions_under_list_form(points)
                    for myUtility in allUtilities:
                        if myUtility['type'] == utilityType:
                            GU['utilities'].append(myUtility)
                            break

                    ligne = ligne + 1

                if ligne != 2:  #If we have some utilityType function, ligne is different from 2
                    if sheet.title == "Multi attribute multilinear":
                        mySession['k_calculus'][1]['GU'] = GU

                    elif sheet.title == "Multi attribute multiplicative":
                        mySession['k_calculus'][0]['GU'] = GU

            except:  #if it doesn't worl because there is no U or utilities type
                pass

        os.remove(file)
        return {'success': True, 'data': mySession}
    except Exception, err:
        os.remove(file)
        return {'success': False, 'data': traceback.format_exc()}
Ejemplo n.º 3
0
def generate_fichier(data):
    
    # On crée un "classeur"

    r = random.randint(1,1000)
    classeur = xlsxwriter.Workbook('fichier'+str(r)+'.xlsx')
    # On ajoute une feuille au classeur
    
    
    
    for monAttribut in data['attributes']:
        
        feuille = classeur.add_worksheet(monAttribut['name'])
     
        
        format01 = classeur.add_format()
        format01.set_num_format('0.00')
        
        formatCoeff = classeur.add_format()
        formatCoeff.set_num_format('0.000000')
        
        formatTitre = classeur.add_format()
        formatTitre.set_bg_color('#C0C0C0')
        formatTitre.set_bold()
        
        formatNom = classeur.add_format()
        formatNom.set_font_color('#D95152')
        formatNom.set_align('center')
        formatNom.set_bold()
        #ici on va mettre toutes les infos sur l'attribut
        
        
        
        #feuille.merge_range('A1:B1','Attribut')
        feuille.write(0,0, 'Attribut', formatTitre);
        feuille.write(0,1, '', formatTitre);
        feuille.write(1, 0, 'Name',formatNom)
        feuille.write(2, 0, 'Unit',formatNom)
        feuille.write(3, 0, 'Val_min',formatNom)
        feuille.write(4, 0, 'Val_max',formatNom)
        feuille.write(5, 0, 'Method',formatNom)
        feuille.write(6, 0, 'Mode',formatNom)
        feuille.write(7, 0, 'Active',formatNom)
        
        feuille.write(1, 1, monAttribut['name'])
        feuille.write(2, 1, monAttribut['unit'])
        feuille.write(3, 1, monAttribut['val_min'])
        feuille.write(4, 1, monAttribut['val_max'])
        feuille.write(5, 1, monAttribut['method'])
        feuille.write(6, 1, monAttribut['mode'])
        feuille.write(7, 1, monAttribut['checked'])
        feuille.write(8, 1, " ")
        feuille.write(9, 1, " ")
        feuille.write(10, 1, " ")
        feuille.write(11, 1, " ")
        feuille.write(12, 1, " ")
        feuille.write(13, 1, " ")
        
        #ensuite on va mettre les points obtenus:
        #feuille.merge_range('C1:D1','Points')
        feuille.write(0,2, 'Points', formatTitre);
        feuille.write(0,3, '', formatTitre);
        feuille.write(1, 2, "Y")
        feuille.write(1, 3, "X")
        #on va maintenant les remplir
        lignePoint=0
        
        for monPoint in monAttribut['questionnaire']['points']:
           feuille.write(lignePoint+2, 2, monPoint[0])
           feuille.write(lignePoint+2, 3, monPoint[1])
           lignePoint=lignePoint+1
        
        #Ensuite on s'occupe de la fonction d'utilité
        #feuille.merge_range('E1:F1','Utility Function')
        # on fait une regression à l'aide des points que l'on a dans le questionnaire et on envoit tout ça dans la fonction regressions du fichier fit.py
        points=monAttribut['questionnaire']['points'][:]

        if len(points)>0:
            if monAttribut['mode']=="normal":
                points.append([monAttribut['val_max'], 1]);
                points.append([monAttribut['val_min'], 0]);
            else:
                points.append([monAttribut['val_max'], 0]);
                points.append([monAttribut['val_min'], 1]);

            #go for fit regression using our points
            utilities=fit.regressions_under_list_form(points);
        else:
            #no need of fit regression because we don't have point
            utilities=[]
        ligne=0;


        for utility in utilities:
        
            feuille.write(ligne,4, 'Utility Function', formatTitre);
            feuille.write(ligne,5, '', formatTitre);
            feuille.write(ligne+1, 4, "type",formatNom)
            feuille.write(ligne+2, 4, "a",formatNom)
            feuille.write(ligne+3, 4, "b",formatNom)
            feuille.write(ligne+4, 4, "c",formatNom)
            feuille.write(ligne+5, 4, "d",formatNom)
            feuille.write(ligne+6, 4, "r2",formatNom)
            feuille.write(ligne+7, 4, "DPL",formatNom)
            
        
            
            #feuille.write(ligne, 5, utility)
            #Dans le cas ou la fonciton d'utilité est de type exp
            #on cherche quel est notre type de fonction d'utilite

            if utility['type']=='exp':
                feuille.write(ligne+1, 5, "exponential")
            if utility['type']=='quad':
                feuille.write(ligne+1, 5, "quadratic")
            if utility['type']=='pow':
                feuille.write(ligne+1, 5, "power")
            if utility['type']=='log':
                feuille.write(ligne+1, 5, "logarithm")
            if utility['type']=='lin':
                feuille.write(ligne+1, 5, "linear")

            #On rempli les coefficients
            try:
                #On remplit d'abord le dernier car pour les coefficients d ça s'arretera
                feuille.write(ligne+6, 5, utility['r2'], formatCoeff)
                feuille.write(ligne+7, 5, convert_to_text(utility, "x"), formatCoeff)
                feuille.write(ligne+2, 5, utility['a'], formatCoeff)
                feuille.write(ligne+3, 5, utility['b'], formatCoeff)
                feuille.write(ligne+4, 5, utility['c'], formatCoeff)
                feuille.write(ligne+5, 5, utility['d'], formatCoeff)
            except:
                pass
                    
            feuille.set_column(5, 5, 20);

            feuille.write(ligne+0,6, 'Calculated points', formatTitre);
            feuille.write(ligne+0,7, '', formatTitre);
            #On va maintenant generer plusieurs points
            amplitude=(monAttribut['val_max']-monAttribut['val_min'])/10.0
            for i in range(0,11):
                feuille.write(ligne+1+i, 6, i*amplitude )
                if utility['type']=='exp':
                    feuille.write_formula(ligne+1+i, 7, funcexp_excel("G"+str(ligne+2+i), "$F$"+str(ligne+3), "$F$"+str(ligne+4), "$F$"+str(ligne+5)))
                elif utility['type']=='quad':
                    feuille.write_formula(ligne+1+i, 7, funcquad_excel("G"+str(ligne+2+i), "$F$"+str(ligne+3), "$F$"+str(ligne+4), "$F$"+str(ligne+5)))
                elif utility['type']=='pow':
                    feuille.write_formula(ligne+1+i, 7, funcpuis_excel("G"+str(ligne+2+i), "$F$"+str(ligne+3), "$F$"+str(ligne+4), "$F$"+str(ligne+5)))
                elif utility['type']=='log':
                    feuille.write_formula(ligne+1+i, 7, funclog_excel("G"+str(ligne+2+i), "$F$"+str(ligne+3), "$F$"+str(ligne+4), "$F$"+str(ligne+5), "$F$"+str(ligne+6)))
                elif utility['type']=='lin':
                    feuille.write_formula(ligne+1+i, 7, funclin_excel("G"+str(ligne+2+i), "$F$"+str(ligne+3), "$F$"+str(ligne+4)))



            #Ensuite on fait le Chart ! (le diagramme)
            chart5 = classeur.add_chart({'type': 'scatter',
                                        'subtype': 'smooth'})

            # Configure the first series.
            chart5.add_series({
                              'name':       utility['type'],
                              'categories': '='+monAttribut['name']+'!$G$'+str(ligne+2)+':$G$'+str(ligne+12),
                              'values':     '='+monAttribut['name']+'!$H$'+str(ligne+2)+':$H$'+str(ligne+12),
     
                              })
     
            # Add a chart title and some axis labels.
            chart5.set_title ({'name': 'Utility Function'})

            # Set an Excel chart style.
            chart5.set_style(4)
            chart5.set_x_axis({
                             'min': monAttribut['val_min'],
                             'max': monAttribut['val_max']
                             })

            # Insert the chart into the worksheet (with an offset).
            feuille.insert_chart('I'+str(1+ligne), chart5, {'x_offset': 25, 'y_offset': 10})
            
            ligne+=15;

    for mesK in data['k_calculus']:
        feuille = classeur.add_worksheet("Multi attribute "+mesK['method'])
    

        
        formatTitre = classeur.add_format()
        formatTitre.set_bg_color('#C0C0C0')
        formatTitre.set_align('center')
        formatTitre.set_bold()
        
        formatNom = classeur.add_format()
        formatNom.set_font_color('#D95152')
        formatNom.set_align('center')
        formatNom.set_font_size(12)
        formatNom.set_bold()
        #ici on va mettre toutes les infos sur l'attribut
        
        feuille.write(0,0, 'K', formatTitre);
        feuille.set_column(0, 0, 10);
        feuille.write(0,1, 'Value', formatTitre);
        feuille.write(0,2, 'Attribute', formatTitre);
        feuille.set_column(2, 2, 30);
        feuille.write(0,3, 'IDAttribute', formatTitre);
        feuille.set_column(3, 3, 10);
        feuille.write(0,4, 'utility type', formatTitre);
        feuille.set_column(4, 4, 15);
        
        
        
        ligne=1
        for monK in mesK['k']:
            feuille.write(ligne, 0, monK['ID'], formatNom)
            feuille.write(ligne, 1, monK['value'])
            feuille.write(ligne, 2, json.dumps(monK['attribute']))
            feuille.write(ligne, 3, json.dumps(monK['ID_attribute']))
            ligne=ligne+1
    

        if mesK['method']=="multiplicative":
            feuille.write(ligne, 0, "K", formatNom)
            feuille.write(ligne, 1, mesK['GK'])
        else:
            feuille.write(ligne, 0, " ", formatNom)
            feuille.write(ligne, 1, mesK['GK'])

        ligne=ligne+3
        if mesK['GU']!=None:
            feuille.write(ligne,0, 'DPL', formatNom);
            feuille.write(ligne,1, mesK['GU']['U']);

            ligne=0
            
            utilities=mesK['GU']['utilities']
            numberUtilities=len(utilities)
            k=mesK['GU']['k']
            
            

            numero=1
            for myUtility in utilities:
                
                feuille.write(numero, 4, myUtility['type'])
                
                feuille.write(ligne,4+numero, "x"+str(numero), formatTitre)
                feuille.write(ligne+1,4+numero, 1)
                
                feuille.write(ligne,4+numero+numberUtilities, "u"+str(numero)+"(x"+str(numero)+")", formatTitre)
                if myUtility['type']=='exp':
                    feuille.write_formula(ligne+1, 4+numero+numberUtilities, funcexp_excel(xl_rowcol_to_cell(ligne+1,4+numero), str(myUtility['a']), str(myUtility['b']), str(myUtility['c'])))
                elif myUtility['type']=='quad':
                    feuille.write_formula(ligne+1, 4+numero+numberUtilities, funcquad_excel(xl_rowcol_to_cell(ligne+1,4+numero), str(myUtility['a']), str(myUtility['b']), str(myUtility['c'])))
                elif myUtility['type']=='pow':
                    feuille.write_formula(ligne+1, 4+numero+numberUtilities, funcpuis_excel(xl_rowcol_to_cell(ligne+1,4+numero), str(myUtility['a']), str(myUtility['b']), str(myUtility['c'])))
                elif myUtility['type']=='log':
                    feuille.write_formula(ligne+1, 4+numero+numberUtilities, funclog_excel(xl_rowcol_to_cell(ligne+1,4+numero), str(myUtility['a']), str(myUtility['b']), str(myUtility['c']), str(myUtility['d'])))
                elif myUtility['type']=='lin':
                    feuille.write_formula(ligne+1, 4+numero+numberUtilities, funclin_excel(xl_rowcol_to_cell(ligne+1,4+numero), str(myUtility['a']), str(myUtility['b'])))
                
                numero=numero+1


            feuille.write(ligne,4+numero+numberUtilities, "U", formatTitre)
            
            def K(i):
                return xl_rowcol_to_cell(i,1, row_abs=True, col_abs=True)
            def U(i):
                return xl_rowcol_to_cell(ligne+1,4+i+numberUtilities)
            
            
            if mesK['method']=="multiplicative":
                if numberUtilities==2:
                    GU=utilite2_excel(K(1), K(2), K(3), U(1), U(2))
                    feuille.write_formula(ligne+1,4+numero+numberUtilities, GU)
                if numberUtilities==3:
                    #in reality K(4) is K
                    GU=utilite3_excel(K(1), K(2), K(3), K(4), U(1), U(2), U(3))
                    feuille.write_formula(ligne+1,4+numero+numberUtilities, GU)
                if numberUtilities==4:
                    GU=utilite4_excel(K(1), K(2), K(3), K(4), K(5), U(1), U(2), U(3), U(4))
                    feuille.write_formula(ligne+1,4+numero+numberUtilities, GU)
                if numberUtilities==5:
                    GU=utilite5_excel(K(1), K(2), K(3), K(4), K(5), K(6), U(1), U(2), U(3), U(4), U(5))
                    feuille.write_formula(ligne+1,4+numero+numberUtilities, GU)
                if numberUtilities==6:
                    GU=utilite6_excel(K(1), K(2), K(3), K(4), K(5), K(6), K(7), U(1), U(2), U(3), U(4), U(5), U(6))
                    feuille.write_formula(ligne+1,4+numero+numberUtilities, GU)

            else:
                nombre=1
                GU=""
                for monK in k:
                    GU+=K(nombre)
                    for dk in monK['ID'].split(','):
                        GU+="*"+U(int(dk))
                    GU+="+"
                    nombre=nombre+1
                    
                GU=GU[:-1]
                feuille.write_formula(ligne+1,4+numero+numberUtilities, GU)


    # Ecriture du classeur sur le disque
    classeur.close()

    #On retourne le nom du fichier
    return 'fichier'+str(r)