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

Python Discussion :

Gestion des valeurs dans un dataframe


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Data Analyst
    Inscrit en
    Janvier 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Data Analyst

    Informations forums :
    Inscription : Janvier 2019
    Messages : 5
    Par défaut Gestion des valeurs dans un dataframe
    Bonjour,
    besoin d'aide en Python.

    J'ai un dataframe avec pour chaque client, plusieurs achats (avec date) et pour chaque achat, plusieurs articles avec la quantité vendue;
    Exemple ci-dessous
    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
    Nclient	Date	Item	Qty
    1	20180125	A	2
    1	20180215	A	3
    1	20180305	B	1
    1	20180305	C	4
    1	20180501	B	3
    2	20180305	D	5
    2	20180220	A	4
    2	20180220	C	1
    3	20180305	D	5
    3	20180425	B	4
    3	20180220	A	1
    4	20180125	B	2
    4	20180215	B	11
    4	20180305	A	1
    4	20180305	D	1
    4	20180501	C	1
    Je souhaiterais écrire un code Python (le plus simple possible évidemment) qui me donne au final pour chaque client :
    - le nbre d'achats,
    - la date de premier et dernier achat,
    - le dernier article (item) acheté,
    - la quantité totale d'articles achetés
    - la quantité d'articles A achetés.

    Merci pour votre aide.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 697
    Par défaut
    Salut,

    Citation Envoyé par JFD59 Voir le message
    J'ai un dataframe avec pour chaque client, plusieurs achats (avec date) et pour chaque achat, plusieurs articles avec la quantité vendue;
    Avec pandas, çà se fait avec des groupby et avec Python, il faudra écrire beaucoup plus de lignes mais c'est pas compliqué (si vous avez pris le temps de débuter).
    Qu'est ce qui vous bloque pour écrire çà?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre à l'essai
    Homme Profil pro
    Data Analyst
    Inscrit en
    Janvier 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Data Analyst

    Informations forums :
    Inscription : Janvier 2019
    Messages : 5
    Par défaut
    C'est pas vraiment que je sois bloqué.
    Je vois bien comment je pourrais faire (en adoptant une logique SAS que je connais nettement mieux), mais je m'aperçois qu'avec Python, il existe parfois des syntaxes courtes qui évitent bcp de codes.
    Sans cela, je partirais sur la création de plusieurs dataframes (ou séries) et un merge au final pour regrouper le tout.

  4. #4
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut.

    La plupart de ces stats se feront avec de simples générateurs et tri de valeurs, comme je m'ennuie un peu, exemple basique en utilisant csv, je ne connais pas panda et je n'ai pas d'install faite de ce module.

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    import io, csv
     
    data = '''
    Nclient Date    Item    Qty
    1       20180125        A       2
    1       20180215        A       3
    1       20180305        B       1
    1       20180305        C       4
    1       20180501        B       3
    2       20180305        D       5
    2       20180220        A       4
    2       20180220        C       1
    3       20180305        D       5
    3       20180425        B       4
    3       20180220        A       1
    4       20180125        B       2
    4       20180215        B       11
    4       20180305        A       1
    4       20180305        D       1
    4       20180501        C       1
    '''
     
    clients = dict()
     
    with io.StringIO(data.strip()) as f :
        reader = csv.DictReader(f, dialect='excel-tab')
        for row in reader :
            dico = dict(
                date=int(row['Date']),
                item=row['Item'],
                quantite=int(row['Qty']),
            )
            clients.setdefault(int(row['Nclient']), []).append(dico)
     
     
    class StatClient :
        def __init__(self, client) :
            self._client = client
     
        def totalAchats(self) :
            return len(self._client)
     
        def totalArticles(self, article=None) :
            if article is None :
                return sum(d['quantite'] for d in self._client)
            return sum(d['quantite'] for d in self._client if d['item'] == article)
     
        def datePremierAchat(self) :
            return sorted(d['date'] for d in self._client)[0]
     
        def dateDernierAchat(self) :
            return sorted(d['date'] for d in self._client)[-1]
     
        def dernierAchat(self) :
            return sorted(clients[1], key=lambda d: d['date'])[-1]['item']
     
        def typeArticles(self) :
            return sorted(set(d['item'] for d in self._client)) 
     
     
    statClient_1 = StatClient(clients[1])
     
    print('nombre achats', statClient_1.totalAchats())
    print('date 1er achat', statClient_1.datePremierAchat())
    print('date dernier achat', statClient_1.dateDernierAchat())
    print('dernier article acquis', statClient_1.dernierAchat())
    print('total articles acquis', statClient_1.totalArticles())
    print('total articles "A" acquis', statClient_1.totalArticles('A'))
    print('Types d\'articles acquis', statClient_1.typeArticles())
    Comme des stats, on peut en faire à volonté, te reste à compléter

  5. #5
    Membre à l'essai
    Homme Profil pro
    Data Analyst
    Inscrit en
    Janvier 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Data Analyst

    Informations forums :
    Inscription : Janvier 2019
    Messages : 5
    Par défaut
    Merci Bistouille,
    va falloir que je cogite pour comprendre la logique de ton code.
    Pas l'habitude !-)


    De mon côté, j'y suis arrivé mais ma logique est tout autre. Voir ci-dessous.
    Pour la qty de item A à calculer, je filtre avant le dataframe puis agrège... n'y a t-il pas moyen de faire une aggrégation "conditionnée" : on fait la somme de qty si une condition est respectée.

    J'ai essayé d'intégrer une fonction dans l'agrégation mais ca marche pas. Soit c'est pas possible, soit j'ai fait une erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def calc(s):
        if d["Item"] == "A" :
            res=s.sum()
        else:
            res=0     
        return res
     
    QtyA=d.groupby("Nclient")["Qty"].agg(calc)


    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
    # création du 1er dataframe
    # on fusionne les labels colonnes pour utilisation futurs
    d2=d.groupby("Nclient").agg({'Date':{'min','max'},'Qty':{'sum'}})
    level20=d2.columns.get_level_values(0)
    level21=d2.columns.get_level_values(1)
    d2.columns=level20+"_"+level21
     
    # création du 2ème dataframe
    # Rq : seule la somme sera utilisée, mais si seulement sum alors on créée une série et non un df et là... plus d'index
    d2A=d[d["Item"]=="A"]
    d2A=d2A.groupby("Nclient").agg({'Qty':{'sum','mean'}})
    level2A0=d2A.columns.get_level_values(0)
    level2A1=d2A.columns.get_level_values(1)
    d2A.columns=level2A0+"_"+level2A1
     
    #on garde dernière et première commande par client pour avoir les articles de ces achats
    ddeb=d.sort_values(by=["Nclient","Date"],ascending=[True,True])
    ddeb=ddeb.drop_duplicates(subset='Nclient')
    dfin=d.sort_values(by=["Nclient","Date"],ascending=[True,False])
    dfin=dfin.drop_duplicates(subset='Nclient')
     
    ddeb=ddeb.set_index("Nclient")
    dfin=dfin.set_index("Nclient")
     
    # on ajoute colonnes des dataframesvia les index
    d2["Qty_A"]=d2A["Qty_sum"]
    d2["FItem"]=ddeb["Item"]
    d2["LItem"]=dfin["Item"]
    d2.reset_index()

  6. #6
    Membre à l'essai
    Homme Profil pro
    Data Analyst
    Inscrit en
    Janvier 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Data Analyst

    Informations forums :
    Inscription : Janvier 2019
    Messages : 5
    Par défaut
    En surfant je suis tombé sur une solution 'aggrégation sous condition'.
    En qq lignes, j'ai ce que je veux... sauf pour le 1er et dernier article achetés (là je pense que je dois les calculer à part et les ajouter ensuite !?)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #la fonction crée une seule série avec les 4 indicateurs comme rows
    def agg_test(grp):
        dmi = grp['Date'].min()
        dmx = grp['Date'].max()
        Qall = grp['Qty'].sum()
        QA = grp.loc[grp['Item'] == "A",'Qty'].sum()
     
        cols = ['DateMin','DateMax','QtyTt','QtyA']
        return pd.Series([dmi,dmx,Qall,QA], index=cols)
     
    # Utiliser cette série avec un groupby,splitte les résultats. 
    Tabl = d.groupby('Nclient').apply(agg_test).reset_index()

  7. #7
    Membre à l'essai
    Homme Profil pro
    Data Analyst
    Inscrit en
    Janvier 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Data Analyst

    Informations forums :
    Inscription : Janvier 2019
    Messages : 5
    Par défaut
    Finalement pour l'aggrégation conditionnée, il y avait cette option très simple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    d2=d[d['Item'] == 'A'].groupby('Nclient')['Qty'].sum()

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

Discussions similaires

  1. Tri des valeurs dans un DBGrid
    Par soviet dans le forum C++Builder
    Réponses: 3
    Dernier message: 11/06/2015, 14h18
  2. WS : Gestion des valeurs null dans le résultat
    Par ALEX731 dans le forum Services Web
    Réponses: 5
    Dernier message: 15/05/2013, 09h16
  3. gestion des enter dans une valeur de champ
    Par Jasmine80 dans le forum Requêtes
    Réponses: 15
    Dernier message: 04/02/2009, 16h09
  4. Gestion des valeurs nulles dans un graphique
    Par ben1f2l dans le forum Jasper
    Réponses: 2
    Dernier message: 21/01/2008, 20h30
  5. Décaler des valeurs dans un tableau
    Par sh2003 dans le forum Langage
    Réponses: 6
    Dernier message: 20/03/2004, 16h01

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