Contenu | Rechercher | Menus

Annonce

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Pour en savoir un peu plus sur l'équipe du forum.

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

#1 Le 02/08/2017, à 16: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, à 13:43)

Hors ligne

#2 Le 02/08/2017, à 22: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

En ligne

#3 Le 02/08/2017, à 22:48

Brunod

Re : [Résolu] Calcul effectif par colonne et par individu

Un import dans un tableur ?


Wanted : emploi dans la sécurité informatique et réseau
Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
37 pc linux convertis

En ligne

#4 Le 03/08/2017, à 09: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, à 09: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, à 09:46)

En ligne

#6 Le 03/08/2017, à 10:29

Brunod

Re : [Résolu] Calcul effectif par colonne et par individu

Marry a écrit :

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 !
smile


Wanted : emploi dans la sécurité informatique et réseau
Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
37 pc linux convertis

En ligne

#7 Le 03/08/2017, à 11: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 ?

En ligne

#8 Le 03/08/2017, à 13: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 smile big_smile

Dernière modification par Marry (Le 03/08/2017, à 13:46)

Hors ligne

#9 Le 03/08/2017, à 13:47

pingouinux

Re : [Résolu] Calcul effectif par colonne et par individu

Marry #8 a écrit :

Le script fonctionne parfaitement.

Je suis le premier surpris, si le fichier est aussi gros que tu l'annonces…

En ligne

#10 Le 03/08/2017, à 14: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, à 15:39

pingouinux

Re : [Résolu] Calcul effectif par colonne et par individu

Je comprends mieux. smile Bonne continuation.

En ligne