Vous devriez savoir le faire avec des listes (simples ou "de listes") et des boucles.
Mais quel est l'intérêt d'avoir un tableau 2D sous la forme de dataframes Pandas si vous n'envisagez pas d'utiliser les fonctionnalités de Pandas?
- W
Version imprimable
Bonjour
J'ai avancé un peu mais je suis de nouveau bloqué je veux partager avec vous l'état d'avancement en espérant trouver de l'aide et surtout des conseils et pistes à suivre
Le fichier principal pou tester le resultat
Le code qui génère les tableaux:Code:
1
2
3
4
5
6
7
8
9 import pandas as pd import numpy as np import random as rand from tableau import * from comparaison import * bigTable = creationtab2() smallTable = creationtab1() comparaison(bigTable,smallTable)
Le code qui compare les tableauCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 import pandas as pd import numpy as np import random as rand def creationtab1(): tabnumber = 1 maliste = [] for loop in range(tabnumber): listetab = [] ligneumber = 1 lignename = str('tab' + str(loop +1)) for loop in range(ligneumber): tb=[rand.randint(2,10),rand.randint(3,15),rand.randint(10,30),0] listetab.append(tb) for loop in range(ligneumber): numpyArray = np.array(listetab) tab_df = pd.DataFrame(data = numpyArray[0:, 0:], index = ['ligne' + str(i + 1) + "_" + lignename for i in range(numpyArray.shape[0])], columns = ['val1', 'val2', 'val3', 'val4']) maliste.append(tab_df) return maliste def creationtab2(): for loop in range(1): listetab = [] ligneumber = 1 print("++++++++ Big Tab++++++++") lignename = str('Bigtab' + str(loop +1)) for loop in range(ligneumber): bigtab=[rand.randint(1000,10000),rand.randint(2000,10000),rand.randint(2000,5000),1 ] listetab.append(bigtab) for loop in range(ligneumber): numpyArray = np.array(listetab) panda_df = pd.DataFrame(data = numpyArray[0:, 0:], index = [lignename for i in range(numpyArray.shape[0])], columns = ['val1', 'val2', 'val3', 'val4']) return panda_df
Le résultat actuel :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 from random import random import pandas as pd import numpy as np def comparaison(bigTab,smallTab): print(bigTab) bigindex = bigTab.index for ind in bigindex: valrb1 = bigTab.loc[ind, 'val1'] valrb2 = bigTab.loc[ind, 'val2'] valrb3 = bigTab.loc[ind, 'val3'] valrb4 = bigTab.loc[ind, 'val4'] i=0 for pand in smallTab: NewBigTab=[] NewSmallTab=[] print("++++++++ Tab num:", i+1 ,"++++++++") print(pand) smallindex = pand.index for li in smallindex: val1 =pand.loc[li,'val1'] val2 =pand.loc[li,'val2'] val3 = pand.loc[li,'val3'] val4 = bigTab.loc[ind, 'val4'] is_solution =(valrb1 > val1 and valrb2 > val2 and valrb3 > val3) if is_solution: valrb1 = valrb1-val1 valrb2 = valrb2-val2 valrb3 = valrb3-val3 NewBigTab.append(valrb1) NewBigTab.append(valrb2) NewBigTab.append(valrb3) NewSmallTab.append(val1) NewSmallTab.append(val2) NewSmallTab.append(val3) NewSmallTab.append(val4) print("++++++++++++Le tableau final NewBigtab est: ++++") for loop in range(1): listetab = [] ligneumber = 1 lignename = str('tab' + str(loop +1)) for loop in range(ligneumber): listetab.append(NewSmallTab) for loop in range(ligneumber): numpyArray = np.array(listetab) tab_df = pd.DataFrame(data = numpyArray[0:, 0:], index = ['ligne' + str(i + 1) + "_" + lignename for i in range(numpyArray.shape[0])], columns = ['val1', 'val2', 'val3','val4']) print(tab_df) i+=1
Mon objectif maintenant est d'appliquer le même code sur un nombre aléatoire des tableaux et répeterCode:
1
2
3
4
5
6
7
8
9
10 ++++++++ Big Tab++++++++ val1 val2 val3 val4 Bigtab1 5931 3918 3435 1 ++++++++ Tab num: 1 ++++++++ val1 val2 val3 val4 ligne1_tab1 9 8 30 0 ++++++++++++Le tableau final NewBigtab est: ++++ val1 val2 val3 val4 ligne1_tab1 9 8 30 1
jusqu'aCode:is_solution =(valrb1 > val1 and valrb2 > val2 and valrb3 > val3)
puis regrouper les petits tableaux dans un grand tableau comme suit:Code:
1
2valrb1, valrb2 et valrb3 = 0
Je sais que c'est devenu anarchique mais j'essaye d'expliquer le maximum possible pour trouver une solutionCode:
1
2
3
4 ++++++++++++Le tableau final NewBigtab est: ++++ val1 val2 val3 val4 ligne1_tab1 9 8 30 1
Désolé de me répéter mais si au bout du compte on se retrouve à comparer 2 tableaux pandas de la même manière qu'on le ferait pour des listes de listes, pandas ne sert à rien.... Et votre code serait bien plus simple sans.
Après vous faites un peu ce que vous voulez de votre temps (et moi du mien) mais plutôt qu'inventer vos propres exercices (dont la finalité est discutable) peut être serait-il plus judicieux d'essayer de faire les exercices proposés dans les tutos (il y a des tutos sur pandas).
- W
Tout ensemble de variables ressemblant de près ou de loin à un tableau, style xxx_1=truc; xxx_2=chose; xxx_3=machin puis ensuite des tests sur l'égalité de ces variables, style if xxx_1 == 0 and xxx_2 == 0 and xxx_3 == 0: ok ça doit s'écrire en vrai tableau. Ah oui, il faut un peu se creuser le citron au début mais au résultat on y gagne
Code:
1
2
3
4 xxx=[truc, chose, machin] for x in xxx: if x != 0: break else: ok
Si demain tu veux un xxx_4=other te suffit de le rajouter dans xxx=[truc, chose, machin, other] et c'est tout, tout le reste du code s'y adapte automatiquement.
Tu aurais appliqué ce principe dès le départ tu n'aurais aucun souci pour gérer un nombre de tableaux totalement variable/aléatoire. Oui, cela signifie qu'il faut avoir un tableau de tableaux et alors? Si tu sais gérer un tableau d'int, tu sauras tout aussi bien gérer un tableau de list.
Et ça peut même se faire en une ligne quand tu connaitras les listes en intension.Code:
1
2
3 valrb=list() for (i, ind) in enumerate(bigindex, 1): valrb.append(bigTab.loc[ind, 'val%d' % i])
Oui, je confirme
Et voilà, au lieu de réfléchir à "comment je dois coder ça" ça devient "comment je peux expliquer ce que je veux à des tiers qui ne sont pas dans ma tête et qui, quoi qu'il arrive, ne pourront avoir qu'une version déformée de ce que à quoi je pense...
Merci Sve@r pour ces pistes
Salut !
Ton code est pas terrible...
Pourquoi 2 fois la même boucle ? Pourquoi créer numpyArray à chaque itération ? ...Code:
1
2
3
4
5 for loop in range(ligneumber): tb=[rand.randint(2,10),rand.randint(3,15),rand.randint(10,30),0] listetab.append(tb) for loop in range(ligneumber): numpyArray = np.array(listetab)
Et sinon je t'invite à avancer du côté des compréhensions de listes à nouveau, ça limiterait le nombre de ligne et ça rendrait le script plus performant.
Mieux vaut faire if valrb1 > val1 and valrb2 > val2 and valrb3 > val3 : directement, c'est également plus performant pour2raisons :la condition renverra faux dès qu'il y a une condition fausse etle résultat n'est pas stocké dans une variable.
Sinon je comprends pas trop ce que tu veux faire...
??Code:for loop in range(1):
Non, ton second exemple >>> resultat = (v1 > v0 and v4 > v5) n'est pas le même que le premier >>> v1 < v0 and v4 > v5. Et il se trouve que v1 est bel et bien supérieur à v0 donc Python continue l'évaluation sur v5.
Que tu testes directement l'expression ou que tu la mettes dans une variable, l'évaluation s'arrête dès qu'une certitude est atteinte. Reste effectivement que stocker l'expression dans une variable puis tester la variable est peu utile si la variable n'est utilisée qu'une seule fois.
Il faut simplifier l'exemple pour le réduire à ce qu'on veut démontrer et éventuellement décomposer...
Si je dis dans une condition ET (ou OU), on s'arrête d'évaluer dès qu'elle est VRAIE ou FAUSSE, pas besoin de faire compliqué:
Je n'arrive pas à imaginer que l'évaluation d'une expression booléenne se fasse différemment en écrivant:Code:
1
2
3
4
5
6
7 >>> True and XX Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'XX' is not defined >>> False and XX False >>>
a la place deCode:
1
2
3a = expression if a: ...
Si c'était le cas, je dirais qu'il y a un "gros bug" (dans le langage).Code:
1
2if expression: ....
Mais on peut tester et se faire avoir par la complication de ses tests pour aboutir à des conclusions fausses: ça arrive tous les jours... Et c'est ce que j'appelle la "rigueur" (des mathématiciens) qui permet d'être en alerte pour "simplifier", reposer le problème autrement,...
- W
Merci, au fait je veux réaliser des statistiques et des courbe donc ca sera plus simple avec des pandas en utilisant matplotlib ou seaborn je crois
Oui je suis entrain de suivre un tuto et faire des exercices sur les listes
pour tester avec un seul tableau car dans le résultat final je doit avoir un nombre aléatoire au lieu d'un seul mais ça marche pas pour le moment qu'avec un seulCode:for loop in range(1):
Tu te rends bien compte que faire for loop in range(1) ne sert à rien ?
Autant faire loop = 0 mais dans la suite du code ça ne sert pas à grand chose... Je te laisse faire le constat par toi même.
Essaye peut-être de clarifier/simplifier/décomposer ton script pour y voir plus clair, mettre 4 boucles imbriquées c'est bien si on maitrise le truc.
Tu peux par exemple faire une fonction pour créer un tableau de façon aléatoire, une fonction pour créer un nombre aléatoire de tableau à partir de la fonction précédente, une fonction pour gérer Pandas, une fonction pour extraire chaque tableau, une fonction pour faire tes comparaisons pour chaque tableau, une autre fonction pour afficher le résultat de la comparaison, etc.
Ok !
A vrai dire je ne comprends pas ce que tu cherches à comparer... :oops:
J'ai noté un truc étrange dans ton code :
val4 = bigTab.loc[ind, 'val4'] ou val4 = pand.loc[li, 'val4'] ?Code:
1
2
3
4 val1 =pand.loc[li,'val1'] val2 =pand.loc[li,'val2'] val3 = pand.loc[li,'val3'] val4 = bigTab.loc[ind, 'val4']
Tu ne compares pas val4 à valrb4 c'est normal ?
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 tableau_de_reference = [[0,1,2],\ [3,4,5],\ [6,7,8]] tableau_a_comparer = [[0,1,2],\ [3,4,55],\ [6,7,8]] for i_r, row in enumerate(tableau_a_comparer): row_ref = tableau_de_reference[i_r] for i_o, obj in enumerate(row): obj_ref = row_ref[i_o] if obj > obj_ref: text1 = f'{row} compare to {row_ref}' text2 = ' '*(str(row).index(str(obj)))+'↑'*len(str(obj))+' '*13+' '*(str(row_ref).index(str(obj_ref)))+'↑'*len(str(obj_ref)) #Pour le fun et imiter les nouvelles versions de Python =) print(text1) print(text2) [3, 4, 55] compare to [3, 4, 5] ↑↑ ↑