#1 Le 02/08/2017, à 15:59
- Marry
[Résolu] Calcul effectif par colonne et par individu
Bonjour,
J'ai une matrice avec mes individus en ligne et des infos en colonnes.
Les individus sont répétés comme dans l'exemple suivant :
Ind S1 S2 S3 S4 S5
A 1 2 0 1 0
B 0 1 2 0 1
C 0 0 1 0 2
A 1 2 2 1 0
B 1 1 2 0 1
C 0 0 1 1 2
A 2 2 0 1 1
B 0 1 1 0 1
C 1 0 1 2 2
Je voudrais connaître le nombre de 0,1et 2 par colonne et par individus comme ceci :
Ind S1 S2 S3 S4 S5
A0 0 0 2 0 2
A1 2 0 0 3 1
A2 1 3 1 0 0
B1 1 3 1 0 3
B2 0 0 1 0 0
...
C2 0 0 0 1 3
Comment faire cela, j'ai pensé à faire une boucle sur le nom de mes individus via grep mais après je suis un peu perdue et vu que j'ai 2 millions de colonnes.....?
Merci d'avance
Dernière modification par Marry (Le 03/08/2017, à 12:43)
Hors ligne
#2 Le 02/08/2017, à 21:30
- pingouinux
Re : [Résolu] Calcul effectif par colonne et par individu
Bonsoir,
Voici un script en python3 qui devrait faire ce que tu veux.
#!/usr/bin/env python3
import sys
dico={}
with open(sys.argv[1],'r') as f:
while True:
lig=f.readline()
if lig=='': break
if lig=='\n': continue
champs=lig.split()
ind=champs[0]
S=champs[1:]
if ind=='Ind': titre=lig[:-1]; lon=len(S); continue
for k in range(lon):
if (ind,S[k]) not in dico:
dico[ind,S[k]]=[]
for j in range(lon): dico[ind,S[k]].append(0)
dico[ind,S[k]][k]+=1
print(titre)
K=sorted(dico.keys())
for k in K:
print(" %s%s"%(k[0],k[1]),end='')
for j in range(lon): print(" %2s"%dico[k][j],end='')
print()
À lancer ainsi, après l'avoir rendu exécutable :
./le_script.py le_fichier_de_données
Il donne ceci sur ton exemple (ta ligne B2 me semble erronée) :
Ind S1 S2 S3 S4 S5
A0 0 0 2 0 2
A1 2 0 0 3 1
A2 1 3 1 0 0
B0 2 0 0 3 0
B1 1 3 1 0 3
B2 0 0 2 0 0
C0 2 3 0 1 0
C1 1 0 3 1 0
C2 0 0 0 1 3
Hors ligne
#3 Le 02/08/2017, à 21:48
- Brunod
Re : [Résolu] Calcul effectif par colonne et par individu
Un import dans un tableur ?
Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis
Hors ligne
#4 Le 03/08/2017, à 08:05
- Marry
Re : [Résolu] Calcul effectif par colonne et par individu
Bonjour,
Brunod difficile le tableur avec 2 millions de colonnes et 30 000 lignes
pingouinux Merci pour ta proposition j'essaie sur mes données et je te dis si cela marche chez moi.
Marry
Hors ligne
#5 Le 03/08/2017, à 08:29
- pingouinux
Re : [Résolu] Calcul effectif par colonne et par individu
Il risque d'y avoir des problèmes de mémoire avec mon script, car il va devoir stocker plus de 60 milliards de valeurs.
Édité :
En fait, on stocke dans un dictionnaire moins de valeurs que ça. Le nombre de clés est le produit du nombre d'individus (3 dans ton exemple : A, B, C) par le nombre de valeurs auxquelles on s'intéresse (3 aussi : 0, 1, 2). À chaque clé est associée une liste dont le nombre d'éléments est le nombre de colonnes de valeurs.
Dernière modification par pingouinux (Le 03/08/2017, à 08:46)
Hors ligne
#6 Le 03/08/2017, à 09:29
- Brunod
Re : [Résolu] Calcul effectif par colonne et par individu
Bonjour,
Brunod difficile le tableur avec 2 millions de colonnes et 30 000 lignes
...
Marry
Ah, ce n'était pas une façon de parler !
Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis
Hors ligne
#7 Le 03/08/2017, à 10:48
- pingouinux
Re : [Résolu] Calcul effectif par colonne et par individu
Les résultats pour chaque colonne étant indépendants, on peut économiser la mémoire en ne traitant pas toutes les colonnes d'un coup. Quelle est la taille du fichier de données ?
Hors ligne
#8 Le 03/08/2017, à 12:42
- Marry
Re : [Résolu] Calcul effectif par colonne et par individu
Le script fonctionne parfaitement.
Je n'ai pas de problème de mémoire car je travail sur un serveur relativement puissant, mais par mesure de précaution j'ai découpé les fichiers.
Merci beaucoup
Dernière modification par Marry (Le 03/08/2017, à 12:46)
Hors ligne
#9 Le 03/08/2017, à 12:47
- pingouinux
Re : [Résolu] Calcul effectif par colonne et par individu
Le script fonctionne parfaitement.
Je suis le premier surpris, si le fichier est aussi gros que tu l'annonces…
Hors ligne
#10 Le 03/08/2017, à 13:17
- Marry
Re : [Résolu] Calcul effectif par colonne et par individu
J'ai découpés mes 2 millions de colonnes en 20 fichiers donc cela devient moins gros,
pour autant j'ai parallélisé pour que le boulot soit fait en même temps sur chaque fichier.
Hors ligne
#11 Le 03/08/2017, à 14:39
- pingouinux
Re : [Résolu] Calcul effectif par colonne et par individu
Je comprends mieux. Bonne continuation.
Hors ligne