def traitementMatrice(dicRealP1, dicMatrice, dicNoProduct, nbrRow, nbrCol): dicResult = {} codeP1 = dicRealP1.keys() codeP1.sort() for keyP1 in codeP1: #key = country,year dicCodeRow = {} dicRealP1[keyP1].sort() vectorP1 = dicRealP1[keyP1] vectorZero = libMatrix.fonctionVectorZero(vectorP1) for productLst in dicRealP1[ keyP1]: #chaque ligne est une liste avec le code produit et la valeur productLst = productLst.split('#') productP1 = productLst[0] valueP1 = float(productLst[1]) keyMatriceP1 = keyP1 + '#' + productP1 if dicNoProduct.has_key(keyMatriceP1): continue else: try: # la ligne de la matrice est dans P1 dicMatrice[keyMatriceP1].sort() vectorMatrice = dicMatrice[keyMatriceP1] except: #la ligne est dans P1 mais PAS dans la matrice, on met un vector avec les valeurs 0 ex: CPA_T pour EE vectorMatrice = vectorZero fileLog.write( 'le produit ' + productP1 + ' existe dans P1 mais pas dans la MATRICE = ' + keyP1 + '\n') #dicMatrice[keyMatriceP1].sort() vectorMatrice.sort() for ligneMatrice in vectorMatrice: # ATTENTION CHAQUE LIGNE CORRESPOND AUX ELEMENTS D'UNE ligne ligneMatrice = ligneMatrice.split('#') product = ligneMatrice[0] if ( product == 'P1' ): #on a recalcule le P1 sur base des row P1=B2G_B3G+D1+D29_M_D39+TOT_CA, dans certain cas le P1 input est vide ou zero value = valueP1 else: value = float(ligneMatrice[1]) keyNoProduct = keyP1 + "#" + product if dicNoProduct.has_key(keyNoProduct): continue # on calcul la matrice A qui est celle des coeficient technique else: dicCodeRow[product] = product try: keyResult = product + productP1 #la cle correspond au code produit de la ligne et la colonne coefTechnique = value / valueP1 dicResult[keyResult] = coefTechnique except: fileLog.write('Division par zero pour matrice ' + keyMatriceP1 + ',keyNoProduct=' + keyNoProduct + ',value=' + str(value) + ',valueP1=' + str(valueP1) + '\n') traitementMatriceA(keyP1, dicRealP1, dicCodeRow, dicResult)
def traitementMatrice(dicRealP1, dicMatrice, dicNoProduct): codeP1 = dicRealP1.keys() codeP1.sort() mVector = [] for keyP1 in codeP1: #key = country,year nbrEleP1 = len(dicRealP1[keyP1]['P1']) matriceA = zeros((nbrEleP1, nbrEleP1), dtype=float) ligne = 0 col = 0 dicRealP1[keyP1]['P1'].sort() dicRealP1[keyP1]['EMP'].sort() colP1 = dicRealP1[keyP1]['P1'] colToBeP1 = dicRealP1[keyP1]['EMP'] ''' fileOutput.write(keyP1+'\n') code = 'EMP,' fileOutput.write(libMatrix.ligneProc(code,colToBeP1)+'\n') ''' if (len(colP1) != len(colToBeP1)): fileLog.write('nbr product P1 =' + str(len(colP1)) + ' nbr product EMP =' + str(len(colToBeP1)) + ' for ' + str(keyP1) + '\n') colEmp = libMatrix.vectorCol( colP1, colToBeP1) #la fonction fait un vecteur avec TOUTES les colonnes colP1.sort() colEmp.sort() vectorP1 = dicRealP1[keyP1]['P1'] vectorZero = libMatrix.fonctionVectorZero(vectorP1) ''' code = 'nama,' fileOutput.write(libMatrix.ligneProc(code,colEmp)+'\n') code = 'P1,' fileOutput.write(libMatrix.ligneProc(code,colP1)+'\n') ''' mVector = map(libMatrix.divide, colEmp, colP1) for productLst in dicRealP1[keyP1][ 'P1']: #chaque ligne est une liste avec le code produit et la valeur productLst = productLst.split('#') productP1 = productLst[0] valueP1 = float(productLst[1]) keyMatriceP1 = keyP1 + '#' + productP1 ligne = 0 if dicNoProduct.has_key(keyMatriceP1): continue else: try: # la ligne de la matrice est dans P1 dicMatrice[keyMatriceP1].sort() vectorMatrice = dicMatrice[keyMatriceP1] except: #la ligne est dans P1 mais PAS dans la matrice, on met un vector avec les valeurs 0 ex: CPA_T pour EE vectorMatrice = vectorZero fileLog.write( 'le produit ' + productP1 + ' existe dans P1 mais pas dans la MATRICE = ' + keyP1 + '\n') vectorP1 = dicRealP1[keyP1]['P1'] #evite les decalages entre P1 et la Matrice, on peux avoir une colonne dans P1 et pas dans la matrice #dans ce cas on ajoute une colonne avec des zero ligneAtraiter = libMatrix.vectorAtraiter( vectorMatrice, vectorP1) ligneAtraiter.sort() for ligneMatrice in ligneAtraiter: #ATTENTION CHAQUE LIGNE CORRESPOND AUX ELEMENTS D'UNE ligne ligneMatrice = ligneMatrice.split('#') product = ligneMatrice[0] value = float(ligneMatrice[1]) keyNoProduct = keyP1 + "#" + product if dicNoProduct.has_key(keyNoProduct): continue #on calcul la matrice A qui est celle des coeficient technique else: if ( ligne < nbrEleP1 ): #le nombre element dans la ligne doit etre le meme que celui de P1 matriceA[ligne, col] = value / valueP1 ligne += 1 else: fileLog.write( 'Probleme matrice: nbrLigne > nbrEleP1 ' + keyMatriceP1 + ',Col=' + str(col) + ',ligne=' + str(ligne) + ',maxEle=' + str(nbrEleP1) + ',nbr produits dans Matrice Produit(nbr Ligne)=' + str(len(dicMatrice[keyMatriceP1])) + '\n') if (col < nbrEleP1): col += 1 else: fileLog.write('Probleme matrice: nbrColonne > nbrEleP1 ' + keyMatrice + ',Col=' + str(col) + ',ligne=' + str(ligne) + ',maxEle=' + str(nbrEleP1) + '\n') #print keyP1, 'len(matriceA)=',len(matriceA), ' len( dicRealP1)=' ,len(dicRealP1) , ' len( mVector)=' ,len(mVector), mVector[len(mVector)-1] traitementMatriceA(keyP1, matriceA, dicRealP1, mVector)
def traitementMatrice(dicRealP1, dicMatrice, dicNoProduct): codeP1 = dicRealP1.keys() codeP1.sort() for keyP1 in codeP1: #key = country,year nbrEleP1 = len(dicRealP1[keyP1]['P1']) matriceA = zeros((nbrEleP1, nbrEleP1), dtype=float) matriceInput = zeros((nbrEleP1, nbrEleP1), dtype=float) ligne = 0 col = 0 dicRealP1[keyP1]['P1'].sort() vectorP1 = dicRealP1[keyP1]['P1'] vectorZero = libMatrix.fonctionVectorZero(vectorP1) for productLst in dicRealP1[keyP1][ 'P1']: #chaque ligne est une liste avec le code produit et la valeur productLst = productLst.split('#') productP1 = productLst[0] valueP1 = float(productLst[1]) keyMatriceP1 = keyP1 + '#' + productP1 ligne = 0 if dicNoProduct.has_key(keyMatriceP1): continue else: try: # la ligne de la matrice est dans P1 dicMatrice[keyMatriceP1].sort() vectorMatrice = dicMatrice[keyMatriceP1] except: #la ligne est dans P1 mais PAS dans la matrice, on met un vector avec les valeurs 0 ex: CPA_T pour EE vectorMatrice = vectorZero fileLog.write( 'le produit ' + productP1 + ' existe dans P1 mais pas dans la MATRICE = ' + keyP1 + '\n') vectorP1 = dicRealP1[keyP1]['P1'] #evite les decalages entre P1 et la Matrice, on peux avoir une colonne dans P1 et pas dans la matrice #dans ce cas on ajoute une colonne avec des zero ligneAtraiter = libMatrix.vectorAtraiter( vectorMatrice, vectorP1) ligneAtraiter.sort() for ligneMatrice in ligneAtraiter: # ATTENTION CHAQUE LIGNE CORRESPOND AUX ELEMENTS D'UNE ligne ligneMatrice = ligneMatrice.split('#') product = ligneMatrice[0] value = float(ligneMatrice[1]) keyNoProduct = keyP1 + "#" + product if dicNoProduct.has_key(keyNoProduct): continue # on calcul la matrice A qui est celle des coeficient technique else: if ( ligne < nbrEleP1 ): # le nombre element dans la ligne doit etre le meme que celui de P1 matriceInput[ligne, col] = value try: matriceA[ligne, col] = value / valueP1 except: fileLog.write('divide by 0.001 ' + keyMatriceP1 + ',Col=' + str(col) + ',ligne=' + str(ligne) + ',value=' + str(value) + ',valueP1 ' + str(valueP1) + '\n') #matriceA[ligne,col] = value/0.001 ligne += 1 else: fileLog.write( 'Probleme matrice: nbrLigne > nbrEleP1 ' + keyMatriceP1 + ',Col=' + str(col) + ',ligne=' + str(ligne) + ',maxEle=' + str(nbrEleP1) + ' ' + str(len(dicMatrice[keyMatriceP1])) + '\n') if (col < nbrEleP1): col += 1 else: fileLog.write('Probleme matrice: nbrColonne > nbrEleP1 ' + keyMatrice + ',Col=' + str(col) + ',ligne=' + str(ligne) + ',maxEle=' + str(nbrEleP1) + '\n') traitementMatriceA(keyP1, matriceA, dicRealP1, matriceInput)