IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Calcul scientifique Python Discussion :

Créer une boucle "for" qui prend en compte les années, les éléments d'une colonne comme numéro d'index. [Python 3.X]


Sujet :

Calcul scientifique Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur Météo
    Inscrit en
    Août 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Ingénieur Météo
    Secteur : Transports

    Informations forums :
    Inscription : Août 2018
    Messages : 9
    Points : 8
    Points
    8
    Par défaut Créer une boucle "for" qui prend en compte les années, les éléments d'une colonne comme numéro d'index.
    Bonjour Chers développeurs, j'ai vraiment besoin de votre aide.

    mon dataframe se présente ainsi

    J.J. 1945 1946 1947 1948 Debut Fin
    1 0 0 0 0 80 199
    2 0 0 0 0 70 201
    3 0 0 0 0 54 213
    4 0 0 0 0 95 203
    5 0 0 0 0 59 216
    6 0 0 0 0 52 201
    7 0 0 0 0 50 214
    8 0 0 0 0 76 211
    9 0 10 0 0 76 208
    10 0 4,4 0 0 47 214
    11 0 0 0 0 61 218
    12 0 0 0 0 61 204
    13 0 0 0 0 64 225
    14 0 0 0 0 81 186
    15 0 0 19,7 0 75 215
    16 0 0 0 0 41 192
    17 0 0 0 0 84 225
    18 0 4,1 0,1 0 56 212
    19 0 0 0 0 50 272
    20 7 0 0 0 58 196

    j'ai écrit un code en python, qui fait la somme à partir du numéro d'un index à un autre numéro du même index(ces numéros sont dans deux colonnes que j'ai nommé début et fin):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    df3=pd.read_excel("culte.xlsx")
    cum_1945 = df3[80:199]["1945"].sum()
    cum_1946 = df3[70:201]["1946"].sum()
    cum_1947 = df3[54:213]["1947"].sum()
    cum_1948 = df3[95:203]["1948"].sum()
    cum_1949 = df3[59:216]["1949"].sum()
    cum_1950 = df3[52:201]["1950"].sum()
    cum_1951 = df3[50:214]["1951"].sum()
    cum_1952 = df3[76:211]["1952"].sum()
    cum_1953 = df3[76:208]["1953"].sum()
    cum_1954 = df3[47:214]["1954"].sum()
    cum_1955 = df3[61:218]["1955"].sum()
    cum_1956 = df3[61:204]["1956"].sum()
    cum_1957 = df3[64:225]["1957"].sum()
    cum_1958 = df3[81:186]["1958"].sum()
    cum_1959 = df3[75:215]["1959"].sum()
    cum_1960 =df3[41:192]["1960"].sum()
    cum_1961 = df3[84:225]["1961"].sum()
    cum_1962 =df3[56:212]["1962"].sum()
    cum_1963 =df3[50:272]["1963"].sum()
    cum_1964 =df3[58:196]["1964"].sum()
    cum_1965 =df3[71:218]["1965"].sum()
    cum_1966 =df3[22:221]["1966"].sum()
    cum_1967 =df3[57:203]["1967"].sum()
    cum_1968 =df3[36:332]["1968"].sum()
    cum_1969 =df3[68:216]["1969"].sum()
    cum_1970 =df3[97:207]["1970"].sum()
    cum_1971=df3[51:216]["1971"].sum()
     
    saladier={'Années':[1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971],
                        'cumul':[(cum_1945), (cum_1946), (cum_1947), (cum_1948), (cum_1949), (cum_1950), (cum_1951), (cum_1952), (cum_1953), (cum_1954), (cum_1955), (cum_1956), (cum_1957), (cum_1958), (cum_1959), (cum_1960), (cum_1961), (cum_1962), (cum_1963), (cum_1964), (cum_1965), (cum_1966), (cum_1967), (cum_1968), (cum_1969), (cum_1970), (cum_1971)]
                    }
     
    df_final= pd.DataFrame(saladier, columns=['Années', 'cumul'], index= None)
     
    df_final.to_excel("saladier.xlsx")
    L'excercie difficile c'est de faire une boucle pour les éléments sur les éléments de la colonne "debut" et "fin" (parce que ce que je veux c'est qu'il me fasse la somme des index du 80 eme jour au 199 eme jour pour l'année 1945 par exemple et ainsi de suite, les éléments de la colonne de "début" constitue le l'initial et le dernier élément se trouve dans la colonne équivalente de "fin")

    Je le trouve assez long du coup j'aimerais introduire une boucle "for" pour les années, les numéros des index pour lesquels il doit m'afficher la somme et le nom de la ville correspondante.


    A la fin je veux obtenir:

    Années cumul
    1945 817,4
    1946 1213,4
    1947 948,5
    1948 1118,2
    1949 1001,4
    1950 1367,5
    1951 1317,7
    1952 884,6
    1953 1014,2
    1954 2156,4
    1955 1511,8
    1956 1762,9
    1957 1425,6
    1958 820,8
    1959 1434
    1960 1813,8
    1961 1497,4
    1962 1567,5
    1963 1939
    1964 1535,4
    1965 1433,8
    1966 1501,7
    1967 1435,5
    1968 2339,5
    1969 1260,6
    1970 1239,3
    1971 1138,3

    Merci d'avance pour votre aide.

  2. #2
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 656
    Points : 1 153
    Points
    1 153
    Par défaut
    Salut,

    Un résultat est sous la forme cumsum = df3[start:end][year].sum(). Il suffit donc de déterminer pour chaque année le début et la fin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i, year in enumerate(range(1945, 1972, 1)):
        start, end = df3.iloc[i]['Debut'], df3.iloc[i ]['Fin']
        cumsum = df3[start:end][year].sum()
    Je n'ai pas essayé le code ci-dessus, mais ça ne devrait pas être loin d'être bon. La liste de dates pourrait être remplacée par un truc du genre [c for c in df3.columns if c not in ('JJ', 'Debut', 'Fin')], ce qui a l'avantage de fonctionner quelque soit le nombre d'années. Pour ce qui est de stocker les résultats, j'ai l'habitude de faire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    res = dict()
    for i, year in enumerate(range(1945, 1972, 1)):
        start, end = df3.iloc[i]['Debut'], df3.iloc[i]['Fin']
        res[year] = df3[start:end][year].sum()
     
    res = pd.DataFrame.from_dict(res, orient=columns)
    J

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur Météo
    Inscrit en
    Août 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Ingénieur Météo
    Secteur : Transports

    Informations forums :
    Inscription : Août 2018
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Salut Julien,

    merci pour ta réponse, qui m'a donnée une piste,
    quand je rédige le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    df3=pd.read_excel("culte.xlsx",  index_col="JJ")
     
    for i, year in enumerate(range(1945, 1972, 1)):
        start, end = df3.iloc[i]['Debut'], df3.iloc[i ]['Fin']
        cumsum = df3[start:end][year].sum()
     
    [c for c in df3.columns if c not in ('JJ', 'Debut', 'Fin')]
     
    res = dict()
    for i, year in enumerate(range(1945, 1972, 1)):
        start, end = df3.iloc[i]['Debut'], df3.iloc[i]['Fin']
        res[year] = df3[start:end][year].sum()
     
    res = pd.DataFrame.from_dict(res, orient=columns)

    Après exécution, il m'affiche cette erreur:
    TypeError: cannot do slice indexing on <class 'pandas.core.indexes.range.RangeIndex'> with these indexers [80.0] of <class 'numpy.float64'>
    Merci infiniment pour ton aide.

  4. #4
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 656
    Points : 1 153
    Points
    1 153
    Par défaut
    Salut,

    Version modifiée et testée (avec les données disponibles, donc la somme vaut 0 pour chaque année) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    res = {'Year': list(), 'Cumsum': list()}
    for i, year in enumerate(range(1945, 1972, 1)):
        start, end = df3.iloc[i]['Debut'], df3.iloc[i]['Fin']
        res['Year'].append(year)
        res['Cumsum'].append(df3[start:end][str(year)].sum())
     
    res = pd.DataFrame.from_dict(res, orient='columns')
    J'ai changé la forme du dictionnaire de résultat, et surtout j'ai passé la date en string, car à la lecture du tableau, un mélange de str et float donne que des str. Par contre j'ai eu quelques erreurs avec les colonnes car il y avait un espace après le nom pour certaines.

    J

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Ingénieur Météo
    Inscrit en
    Août 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Ingénieur Météo
    Secteur : Transports

    Informations forums :
    Inscription : Août 2018
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Julien, encore une fois merci pour ta réponse,


    mais j'ai encore la même erreur qui s'affiche, il faut que je précise que je code sur l'environnement Jupyter:



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cannot do slice indexing on <class 'pandas.core.indexes.range.RangeIndex'> with these indexers [80.0] of <class 'numpy.float64'>

    je ne sais vraiment pas où se situe le problème.


    Merci Julien

  6. #6
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 656
    Points : 1 153
    Points
    1 153
    Par défaut
    Salut,

    Avec l'exemple fourni, chez moi, aucune erreur n'est levée. Est-ce tu pourrais copier le traceback en entier ? Avec juste cette partie ce n'est pas aisé de comprendre ce qui ne va pas. Mais je vais quand même faire une tentative.

    Je suppose que le problème est à la ligne 5:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    res['Cumsum'].append(df3[start:end][str(year)].sum())
    Et que 80.0 est la valeur de début pour la ligne 1 correspondant à l'année 1945. Je comprends donc que l'erreur est que l'on cherche à récupérer une tranche du tableau entre les indices 80 et 199 mais qu'on lui demande de faire cela entre les nombres 80.0 et 199.0, ce qui n'est pas possible. Dans ce cas il faut forcer les indices start et end à être des entiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    start, end = int(df3.iloc[i]['Debut']), int(df3.iloc[i]['Fin'])
    J

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Ingénieur Météo
    Inscrit en
    Août 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Ingénieur Météo
    Secteur : Transports

    Informations forums :
    Inscription : Août 2018
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Bonsoir Julien,


    infiniment merci.

    ça marche très bien. Il fallait qu'il le reconnaisse comme un entier.

    Merci pour ton assistance.


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Créer une colonne qui peut contenir plusieurs données
    Par jean jojo dans le forum Langage SQL
    Réponses: 10
    Dernier message: 11/01/2019, 14h32
  2. Réponses: 3
    Dernier message: 27/03/2015, 15h09
  3. Réponses: 4
    Dernier message: 27/03/2013, 14h56
  4. qui prend en charge les pages asp / apsx?
    Par tartuffe2 dans le forum IIS
    Réponses: 1
    Dernier message: 26/03/2007, 09h01
  5. Créer une interface comme en java
    Par nesquik dans le forum C++
    Réponses: 7
    Dernier message: 01/03/2006, 23h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo