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 :

question optimisation valeur de dictionnaire cumulée pour les clef inférieurs


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Par défaut question optimisation valeur de dictionnaire cumulée pour les clef inférieurs
    Bonjour,

    alors je sais que le titre n'est pas très explicites mais je n'est pas vraiment de meilleur "définition" du problème.

    alors voila à partir d'une base de donnée je reçoit plusieurs milliers de lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    async with ctx.typing():
    		async with aiosqlite.connect("data.db") as db:
    			async with db.execute(req, parameters) as cursor:
    				async for row in cursor:
    					channel_id = row[0]
    					key = datetime.datetime.utcfromtimestamp(row[1]).date()
    					if channel and channel_id != channel.id:
    						continue
    					dict_messages[key] = dict_messages.get(key, 0) + 1
    Voilà ça c'est pour le contexte, je me retrouve avec un dictionnaire tel que dict_messages[datetime.date] = nombre de message, voici un extrais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    {
    	datetime.date(2019, 1, 23): 56,
    	datetime.date(2019, 1, 24): 6,
    	datetime.date(2019, 1, 25): 4,
    	datetime.date(2019, 1, 26): 206,
    	datetime.date(2019, 1, 27): 328,
    	datetime.date(2019, 1, 28): 107,
    	datetime.date(2019, 1, 29): 134,
    	datetime.date(2019, 1, 30): 236,
    	datetime.date(2019, 1, 31): 103
    }
    Voilà donc ça c'est pour le contexte, maintenant j'aimerais cumulé les valeurs des clefs inférieurs, pour l'instant j'ai ça, ça semble marcher mais ça me parais assez moche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dict_messages_cumul = {}
    		for k, v in dict_messages.items():
    			dict_messages_cumul[k] = sum([v2 for k2, v2 in dict_messages.items() if k2<=k])
    Je suis sur qu'il y a une façon plus élégante de faire ça, je pense à numpy / itertools mais je ne les connais absolument pas.

    Merci

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Tout d'abord tu ne peux pas avoir la certitude que le dictionnaire soit ordonné. Il faut en tenir compte.

    Moi, j'ai ça en magasin:
    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
     
    >>> import datetime
    >>> mssgs = {
    ...     datetime.date(2019, 1, 23): 56,
    ...     datetime.date(2019, 1, 24): 6,
    ...     datetime.date(2019, 1, 25): 4,
    ...     datetime.date(2019, 1, 26): 206,
    ...     datetime.date(2019, 1, 27): 328,
    ...     datetime.date(2019, 1, 28): 107,
    ...     datetime.date(2019, 1, 29): 134,
    ...     datetime.date(2019, 1, 30): 236,
    ...     datetime.date(2019, 1, 31): 103
    ... }
    >>> keys = sorted(mssgs.keys())
    >>> cumul = {keys[0]: mssgs[keys[0]]}
    >>> for idx, item in enumerate(keys[1:]):
    ...     cumul[item] = cumul[keys[idx]] + mssgs[item]
    ... 
    >>> for i in sorted(cumul):
    ...     print(i, cumul[i])
    ... 
    2019-01-23 56
    2019-01-24 62
    2019-01-25 66
    2019-01-26 272
    2019-01-27 600
    2019-01-28 707
    2019-01-29 841
    2019-01-30 1077
    2019-01-31 1180

  3. #3
    Membre chevronné
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Par défaut
    Actuellement j'ai ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dict_messages = {k: sum([v2 for k2, v2 in dict_messages.items() if k2<=k]) for k, v in dict_messages.items()}
    . Visiblement il n'existe pas de solution build-in / numpy, dommage

    L'idée derrière ça est de tracer des graphes à l'aide de matplotlib, et ainsi avoir une courbe du nombre de message total en fonction de la date plutôt qu'une courbe en dans de scie.

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Je n'ai rien contre les list comprehension, j'en utilise régulièrement mais la tienne est longue et procède au recalcul de l'ensemble des dates à chaque itération.

    Ce que ne fait pas ma solution en trois lignes lisibles et claires, Même mon poisson rouge comprendrait mon code.

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Citation Envoyé par flapili Voir le message
    Actuellement j'ai ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dict_messages = {k: sum([v2 for k2, v2 in dict_messages.items() if k2<=k]) for k, v in dict_messages.items()}
    . Visiblement il n'existe pas de solution build-in / numpy, dommage

    L'idée derrière ça est de tracer des graphes à l'aide de matplotlib, et ainsi avoir une courbe du nombre de message total en fonction de la date plutôt qu'une courbe en dans de scie.
    Bien sûr que si, numpy propose des choses. Sauf que là vous travailler avec des dico et numpy lui travaille avec des arrays ... Ordonner votre dictionnaire, créer un numpy array avec ses valeurs, puis faites un np.cumsum sur cette array et réassigner ce qu'il vous faut.

  6. #6
    Membre chevronné
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Par défaut
    Bonjour,
    petit retour sur mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    x = numpy.array(sorted(messages.keys()))
    y = numpy.array([messages[k] for k in x])
    if cumul:
    	y = numpy.cumsum(y)
    	nb_messages = numpy.max(y)
    else:
    	nb_messages = numpy.sum(y)
    Actuellement je n'est qu'une 50ène de valeurs dans mon dictionnaire mais il est clair que ce n'était pas le optimal.
    Décidément Numpy est vraiment très intéressant.

Discussions similaires

  1. [phpMyAdmin] Valeur par défaut null pour les types numériques
    Par xianxian620 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 11
    Dernier message: 09/12/2008, 15h34
  2. Quelle optimisation en taille d'écran pour les sites
    Par JeanMi66 dans le forum Webdesign & Ergonomie
    Réponses: 26
    Dernier message: 16/09/2008, 21h37
  3. Valeur par défaut null pour les types numériques
    Par xianxian620 dans le forum Requêtes
    Réponses: 3
    Dernier message: 27/05/2008, 11h57
  4. Réponses: 9
    Dernier message: 05/11/2007, 11h05

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