2 votes

Calcul de la moyenne sur plusieurs fichiers

Je suis très novice en Python et j'ai également beaucoup cherché pour trouver une question similaire à la mienne. Je voudrais faire quelque chose de similaire à ce qui est expliqué dans cette question Calculer des moyennes d'enregistrements provenant de plusieurs fichiers avec python

Cependant, au lieu de prendre la moyenne de chaque valeur (car dans cet exemple, toutes les valeurs sont numériques), je voudrais prendre la moyenne pour une seule colonne, mais garder toutes les mêmes valeurs pour les autres colonnes".

Par exemple :

fileA.txt:  
0.003 0.0003 3 Active   
0.003 0.0004 1 Active  

fileB.txt:  
0.003 0.0003 1 Active   
0.003 0.0004 5 Active  

et je voudrais générer le fichier de sortie suivant

output.txt
0.003 0.0003 2 Active   
0.003 0.0004 3 Active

Bien que les colonnes 1 et 2 soient également numériques, elles auront la même valeur pour une même position dans 100 fichiers. Je ne m'intéresse donc qu'à la valeur moyenne de chaque élément sur 100 fichiers pour la colonne 3.

Aussi, bien que le code dans la question Calculer des moyennes d'enregistrements provenant de plusieurs fichiers avec python fonctionne pour lire mes fichiers. Il n'est pas utile si vous avez beaucoup de fichiers. Comment puis-je optimiser cela ?

Je parviens à lire mes fichiers en utilisant le code suivant :

import numpy as np

result = []
for i in my_files:
    a = np.array(np.loadtxt(i, dtype = str, delimiter = '\t', skiprows = 1))
    result.append(a)
result = np.array(result)

J'ai utilisé un code similaire à celui suggéré dans cette question initialiser un tableau numpy

Chacun de mes fichiers contiendra environ 1500 lignes pour 4 colonnes. J'ai essayé d'utiliser np.mean mais cela ne fonctionne pas, probablement parce que certaines de mes données sont de type chaîne.

Merci d'avance pour votre aide !

1voto

unutbu Points 222216

Si vous chargez les tableaux avec np.genfromtxt(..., dtype=None) entonces genfromtxt va deviner le dtype de chaque colonne. Par exemple, la troisième colonne recevra un dtype entier. Ainsi, votre tableau sera adapté à l'arithmétique. Utilisation de dtype='str' donne un tableau de chaînes de caractères, qui n'est pas adapté à l'arithmétique.


import csv
import numpy as np
import itertools as IT
my_files = ['fileA.txt', 'fileB.txt']

vals = None
for num, filename in enumerate(my_files, 1):
    arr = np.genfromtxt(filename, dtype=None, delimiter='\t', skiprows=1, usecols=(2,))
    print(arr)
    if vals is None:
        vals = arr
    else:
        vals += arr

meanvals = vals / num

with open(my_files[0], 'rb') as fin, open('/tmp/test.csv', 'wb') as fout:
    # skip first row
    next(fin)
    writer = csv.writer(fout, delimiter='\t', lineterminator='\n')
    for row, val in IT.izip(csv.reader(fin, delimiter='\t'), meanvals):
        row[2] = val
        writer.writerow(row)

Le résultat, en /tmp/test.csv ressemble à ça :

0.003   0.0003  2   Active
0.003   0.0004  3   Active

0voto

matty T pain Points 762

Il y a un autre mot-clé arg dans np.loadtxt : usecols . Essayez de l'utiliser, par exemple

a = np.loadtxt(i, usecols = (0,1,2), delimiter = '\t', skiprows = 1)

Vous n'avez pas besoin de np.array puisque np.importtxt retourne un ndarray. J'ai omis le dtype=str car la valeur par défaut est dtype=float, ce qui devrait vous convenir si vous voulez calculer la moyenne.

De même, au lieu de créer un tableau de tableaux, si vous souhaitez simplement calculer la moyenne dans chaque fichier, je vous suggère de le faire dans la boucle for et de sauvegarder le résultat de ce calcul.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X