Calcule de moyennes en Boucle dans une liste

Johny34110 Messages postés 5 Statut Membre -  
jee pee Messages postés 9441 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour à la communauté !

Je viens vers vous pour ,je l'espère trouver une réponse sur un sujet que je bloque depuis quelques jours ...
En effet j'ai une liste sur python de 300 éléments et j'aimerais calculer la moyenne des 4 premières valeurs puis des 4 suivantes etc.... jusqu'à la fin.
Pour enfin faire la moyenne de toutes ces moyennes ....

Je pensais faire la moyenne avec la commande : [0-4] [5-9] pour prendre que les 4 valeurs à chaques fois de ma liste mais sur 300 éléments... ca fais beaucoup à taper ..
Si vous avez une idée pour une boucle qui permettrait de le faire automatiquement ????

Merci d'avance a vous tous ❤️

Configuration: Android / Chrome 101.0.4951.61

7 réponses

  1. Utilisateur anonyme
     
    Bonjour

    Tout d'abord une remarque
    j'aimerais calculer la moyenne des 4 premières valeurs puis des 4 suivantes etc.... jusqu'à la fin.
    Pour enfin faire la moyenne de toutes ces moyennes ....

    D'un point de vue strictement mathématique, faire la moyenne de tous les éléments en une seule fois te donnera le même résultat.
    En informatique, il peut y avoir une différence sensible, mais ce sera dû à la façon de transcrire les nombre décimaux en binaire qui arrondit beaucoup de valeurs à un plus proche que l'on peut coder.
    Et donc pour obtenir un résultat le plus vrai possible, il est préférable de faire la moyenne d'un coup.
    Sauf bien sûr, si les moyennes intermédiaires ont de l'intérêt pour toi (et encore que....)
    Si tu n'es pas sensibilisé à ce point, voir ceci https://forums.commentcamarche.net/forum/affich-35846831-erreur-de-calcul#3

    Bref, maintenant que tu es averti, une solution est de faire une boucle dans une boucle, une autre est de faire une boucle qui va de 4 en 4
    0
  2. Utilisateur anonyme
     
    Bonjour,

    Je ne code pas en Python, mais la logique devrait être la même que dans les autres langages.
    Initialise une variable
    nbLoop
    en dehors de ta boucle avec la valeur 0, et une autre
    tmpTotal
    qui servira à stocker le total des 4 dernières valeurs.
    Pour chaque tour de boucle, ajoute 1 sur
    nbLoop
    , et tu additionnes
    tmpTotal
    .
    Lorsque tu atteins 4, remet
    nbLoop
    à 0 et recommence ton addition dans
    tmpTotal
    .

    0
  3. jee pee Messages postés 9441 Date d'inscription   Statut Modérateur Dernière intervention   9 981
     
    Bonjour,

    En dehors de l'aspect signalé par Whismeril, c'est typiquement le rôle d'une boucle avec un pas d'incrément, 4 dans ton cas. Exemple
    import random
    taille=32
    tab = [random.randint(0, 100) for x in range(taille)]
    print(tab)
    cumulGlobal=0
    for i in range(0,taille,4):
        print("i =",i)
        cumul=0
        for j in range(4):
            print("    j =",j," i+j =",i+j,"tab[i+j} =",tab[i+j])
    
    


    0
  4. Johny34110 Messages postés 5 Statut Membre
     
    Merci
    j'ai éssayer d'intégrer le code au mien mais j'obtiens cette erreur
    " line 40, in <module>
    for i in range(0,turbi,4):
    TypeError: 'list' object cannot be interpreted as an integer

    voilà mon programme:
    turbi = []
    prof = []
    temp = []
    date = []
    a = 4 # convertir min
    b = 4 * 24
    c = 4 * 24 * 7
    with open("C:\\Users\John\Desktop\PYTHON\Poizot\STBD_33002_20130712_085653.txt",
    "r") as data: # ouverture et lecture des datas

    data = [e.replace(',', '.') for e in data]
    data = data[5:]

    for ligne in data: # lecture des lignes dans data , exclusion des 6 premieres

    liste = ligne.split(';') # supprimation des espaces
    turbi.append((float(liste[0])))
    prof.append((float(liste[1])))
    temp.append((float(liste[2])))
    date.append(((liste[3])))

    cumulGlobal=0
    for i in range(0,turbi,4):

    cumul=0
    for j in range(4):
    print(" j =",j," i+j =",i+j,"tab[i+j} =",tab[i+j])

    si vous pouvez m'aider ? :)
    merci
    0
    1. Utilisateur anonyme
       
      En Python, l’indentation est primordiale, or par défaut le site ne la conserve pas.
      Pour la conserver il faut utiliser les balises de code. Voir ce petit tuto https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
      On pourra commencer à essayer de t’aider quand tu auras reposté correctement ton code.
      0
    2. jee pee Messages postés 9441 Date d'inscription   Statut Modérateur Dernière intervention   9 981
       
      peut être len(turbi), pas turbi
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Johny34110 Messages postés 5 Statut Membre
     
    Merci pour le petit tuto whismeril , de mon coté sa n'avance toujours pas vraiment je suis toujours bloqué sur la partie
    boucle de jee pee

    turbi = []
    prof = []
    temp = []
    date = []
    a = 4  # convertir min
    b = 4 * 24
    c = 4 * 24 * 7
    with open("C:\\Users\John\Desktop\PYTHON\Poizot\STBD_33002_20130712_085653.txt",
              "r") as data:  # ouverture et lecture des datas
    
        data = [e.replace(',', '.') for e in data]
        data = data[5:]
        
    
    for ligne in data:  # lecture des lignes dans data , exclusion des 6 premieres
    
        liste = ligne.split(';')  # supprimation des espaces
        turbi.append((float(liste[0])))
        prof.append((float(liste[1])))
        temp.append((float(liste[2])))
        date.append(((liste[3])))
    MoyTh = sum(turbi) / (len(date) *a )
    MoyPh = sum(prof) / (len(date) * a)
    MoyTph = sum(temp) / (len(date) * a)
    
    MoyTj = sum(turbi) / (len(date) * b)
    MoyPj = sum(prof) / (len(date) * b)
    MoyTpj = sum(temp) / (len(date) * b)
    
    MoyTs = sum(turbi) / (len(date) * c)
    MoyPs = sum(prof) / (len(date) * c)
    MoyTps = sum(temp) / (len(date) * c)
    
    
    
    
    
    
    taille=len(turbi)
    tab = [random.randint(0, 100) for x in range(taille)]
    print(tab)
    cumulGlobal=0
    for i in range(0,taille,4):
        print("i =",i)
        cumul=0
        for j in range(4):
            print("    j =",j," i+j =",i+j,"tab[i+j} =",tab[i+j])
    


    je vois pas trop comment l'adapter pour mon projet :/
    si vous pouvez m'éclairer ! merci d'avance
    0
    1. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
       
      Bonjour,

      A mon avis, les lignes 15 à 21 devraient être indentées, donc sous le with()
      Je me demande comment se présente ton fichier texte ...
      Sinon:
      # ouverture et lecture des datas : pas de s a data, c'est déjà un mot au pluriel (singulier : datum)
      # supprimation des espaces : c'est plutôt suppression :-) :-)
      et calcul de moyennes
      0
    2. jee pee Messages postés 9441 Date d'inscription   Statut Modérateur Dernière intervention   9 981
       
      Si les valeurs à traiter sont dans turbi :

      cumulGlobal=0
      moyenne4=[]
      for i in range(0,len(turbi),4):
          print("i =",i)
          cumul=0
          for j in range(4):
              print("    j =",j," i+j =",i+j,"turbi[i+j] =",turbi[i+j])
              cumul += turbi[i+j]
              cumulGlobal += turbi[i+j]
          moyenne4.append(cumul/4)
          print(moyenne4)
      moyenneGlobale = cumulGlobal / len(turbi)
      print(moyenneGlobale)    


      tu peux te passer de cumulGlobal si en fin tu effectues la moyenne des moyennes, tu pourrais te passer de la boucle j si tu mets en dur les 4 indices i, i+1, i+2, i+3 pour calculer la moyenne directe, tu peux utiliser sum(turbi), ... suivant ce que tu connais des instructions, mais utiliser les boucles i et j avec des prints doit te permettre de décomposer l'algorithme

      moyenneGlobale = sum(turbi)/len(turbi)   
      moyenne4=[]
      for i in range(0,len(turbi),4):
          moyenne4.append((turbi[i]+turbi[i+1]+turbi[i+2]+turbi[i+3])/4)
      1
  7. Johny34110 Messages postés 5 Statut Membre
     
    Merci à tous pour votre aide !
    Ducoup après bidouillages je suis partie sur une boucle permettant de calculer mes moyennes du type :

    i , pas = 0,4
    while 1:
        s=0
        try:
            for x in range(pas):
                s=s+turbi[i+x]        #calcule de la somme
            MoyTh.append(s/pas)       #Liste apprend les valeurs somme/pas
            i=i+pas                   #passer aux "pas" suivant
        except:
            break
    MoyTh1= sum(MoyTh)/len(MoyTh)


    Merci encore!
    0
    1. jee pee Messages postés 9441 Date d'inscription   Statut Modérateur Dernière intervention   9 981
       
      bidouillages c'est exactement ce que je pensais en lisant ton code. Tu cherches les complications, gérer un indice à la main alors qu'une boucle le fait mieux et surtout la sortie est horrible, générer une erreur d'indice pour quitter. C'est comme scier la branche sur laquelle on est assis, juste pour ne pas avoir à prendre la décision de sauter pour descendre ;-)
      0
  8. Johny34110 Messages postés 5 Statut Membre
     
    j'étais obligé de créer une boucle avec condition car sinon j'avais une erreur de range quand j'utilisais le tien , car je penses qu'il était impossible de classer toute les valeurs de la liste par groupe de 4.
    De plus , j'ai commencé python il y'a une semaine, donc forcement je suis pas encore un "maitre" dans le domaine.
    Mais merci pour la remarque...
    0
    1. jee pee Messages postés 9441 Date d'inscription   Statut Modérateur Dernière intervention   9 981
       
      Tu peux utiliser la division entière //
      for i in range(0,(len(turbi)//4)*4,4):    


      Après une question pratique se pose quand les valeurs ne sont pas des multiples de 4, comment moyenne générale doit être évaluée, avec toutes les valeurs, ou seulement celles retenues dans les groupes par 4 ?
      0