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 de stock et flux


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 31
    Points : 16
    Points
    16
    Par défaut Gestion de stock et flux
    Bonjour à tous,

    voici mon soucis. Imaginons plusieurs objets de différentes tailles que l'on désire stocker dans différentes boites de différents volumes. Pour chaque objet, on a donc les caractéristiques (dimensions) mais aussi la date où l'on pose l'objet dans une des boites et la date où l'on sort l'objet. Forcément à chaque fois qu'on retire un objet, de la place se libère et influe sur le choix pour où poser le prochain objet, etc...
    J'ai fait une classe objet avec les caractéristiques et une classe boites avec leurs dimensions (et une méthode qui remet à jour le volume lorsqu'un objet est déposé). Mon problème est que je ne vois pas comment faire pour "checker" les dates, enlever les objets et mettre à jour les volumes de chacune des boites. Quelle est la méthode la plus simple ?

    Merci beaucoup

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    J'ai oublié de mettre mon code :

    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
    class Colis(object):
        global df
        def __init__(self, id):
            self.surface = df['surface'][id]
            self.date_arr = df['date_arrive'][id]
            self.date_dep = df['date_depart'][id]
     
    class Entrepot(object):
        def __init__(self, surface_tot):
            self.surface_tot = surface_tot
     
        def maj_surface(self, surface):
            self.surface_tot -= surface
            return self.surface_tot
     
        def depart_colis(self, surface):
            self.surface_tot += surface
    A = Entrepot(15)
    B = Entrepot(100)

    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
    def remplissage():
        # on commence par remplir A, si A est plein on remplit B
        global df 
        for i in range(0, len(df['id'])):
            if A.surface_tot >= 0:
                A.maj_surface(Colis(i).surface)
                for j in range(0, len(df['id'])):
                    if Colis(j).date_dep <= Colis(i).date_arr and i > j:
                        A.depart_colis(Colis(j).surface)
                        df.drop(df.index[j])
            else:
                B.maj_surface(Colis(i).surface)
                for j in range(0, len(df['id'])):
                    if Colis(j).date_dep <= Colis(i).date_arr and i > j:
                        B.depart_colis(Colis(j).surface)
                        df.drop(df.index[j])
    Les données sont des objets avec comme variables: id, surface, date_arr, date_depart. Je remplis la boite A avec les objets, puis quand la boite A est pleine, je commence à remplir la boite B. Un objet arrive à une date et part d'une boite à une autre date. La place disponible change lorsqu'un objet est sorti d'une boite.

    On dirait que j'ai un soucis. Des idées ?
    Merci

  3. #3
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Quelle est la méthode la plus simple ?
    Cette réponse ne va sans doute pas te plaire, mais instinctivement je dirais de le faire sur papier...

    Si tu sais résoudre sur papier, alors le problème n'est pas algorithmique, et il faut apprendre python. Mais je te rassure c'est la chose la plus simple...

    Apparemment sans juger, c'est pas facile au début, tu t'appuies peu sur des codes existants. Je le remarque car dans une classe, tu mets le mot clé global alors que l'utilisation des classes permets surtout de l'éviter (en fait on a aucun besoin de ce mot clé).

    Pour apprendre les bonnes pratiques, tu peux t'appuyer sur le tutoriel officiel de la documentation python ou sur un tutoriel qui a fait ses preuves, Swinnen.

    Ensuite on ne sait pas ce qu'est pour toi,
    • Vérifier les dates et surtout concrètement sans code ce que tu comptes faire pour y parvenir.
    • Des objets (dans les colis ? Si oui, combien ? ... ?)
    • Qu'est-ce qu'une boîte ? Un colis ? Un objet ?
    • Le volume, un ensemble d'objet dans une boîte, un colis ? Un vrai volume, terme mathématiques ?


    Le problème est tellement peu détaillé, difficile à cerner que je comprend que le transcrire en python semble totalement impossible actuellement.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    Merci. Je me rends compte que ce n'est pas bien détaillé.
    Voilà le probleme : j'ai un csv avec des objets (classe colis)
    - id surface date_arr date_depart
    0 1 . 21 . 12/12/2018 01/01/2021
    1 . 2 . 1.5 . 01/02/2019 . 07/12/2019
    etc.

    J'ai simplifié le problème en prenant deux boites A et B (classe entrepot) de surface 15 et 100. J'ai mis le csv dans un dataframe: df
    Je place les colis un par un par ordre de date_arr et lorsque la boite A est remplie, je commence à remplir la boite B. On travaille en surface et non en volume.
    Je dois aussi checker si on doit retirer un colis avec data_depart. Lorsqu'on retire un colis, la surface se met à jour.
    Je ne sais pas si c'est le plus simple de passer par des classes mais je cherche un truc pas trop trivial pour m'entrainer.

    Merci de votre aide

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Salut,

    Citation Envoyé par Naunau75 Voir le message
    Je ne sais pas si c'est le plus simple de passer par des classes mais je cherche un truc pas trop trivial pour m'entrainer.
    De toutes façons sans traduire la relation "{colis} est dans {entrepôt/boîte}" d'une façon ou d'une autre...

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

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    Salut,

    Ce n'est pas la bonne approche ? J'aurais pu passer par la création d'un dictionnaire (ou tuple) mais je voulais passer par les classes où chaque ligne du csv représente un objet (colis)

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Salut,

    Citation Envoyé par Naunau75 Voir le message
    Ce n'est pas la bonne approche ? J'aurais pu passer par la création d'un dictionnaire (ou tuple) mais je voulais passer par les classes où chaque ligne du csv représente un objet (colis)
    La question à vous poser est de savoir comment vous allez bien pouvoir retirer un colis de A pour le placer en B sans traduire d'une façon ou d'une autre "est dans".
    On peut représenter cela de plusieurs façons à vous de choisir celle qui vous paraît la plus appropriée... ou retenir chacune des idées qui vous vient pour voir comment vous allez bien pouvoir coder çà (avec ou sans classes): explorer, réaliser, comparer les différentes solutions est (peut être) tout l'intérêt de l'exercice.
    En tous cas, si vous n'avez rien choisi, il est prématuré de coder (sauf à vous imposer ce sera écrit en Python et que vous utiliserez des "class" - ou pas -).

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

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    Les colis sont retirés : attributs surface du colis et attributs surface_tot de l'entrepot (surface_tot = surface_tot - surface)

    Sur une feuille de papier, c'est simple... en fait j'ai simplifié à l'extrème l'exercice pour commencer "petit". J'ai normalement plusieurs entrepots/boites avec des étagères, etc. Faut checker sur les dimensions des colis pour savoir où les positionner.
    C'est pour ça que je voulais passer par des classes. Je simplifie mon problème avec posant deux entrepots ou boites et je les remplis en gardant que la contrainte de surface.
    Les boites sont des zones de stockage, un colis ne passe pas de A en B. Il est en A ou B, puis il s'en va à une certaine date.
    Ma méthode est :
    - je transforme le csv en dataframe où chaque ligne serait un objet colis
    - je classe par date d'arrivée puis je commence à poser les colis un par un dans A (la surface disponible de la boite diminue) boucle for sur l'index
    - une fois qu'on ne peut plus mettre de colis en A, je commence à remplir B de la même façon.
    - je checke en même temps si la data de départ est inférieure à la date d'arrivée, avec une autre boucle for. Si oui, le colis est enlevé de la boite et la surface disponible augmente. Je dois mettre à jour le dataframe pour lui indiquer que le colis a été retiré.
    - une fois que j'ai passé en revue toutes les dates d'arrivée, je devrai avoir la surface disponible restante pour A et B

    Voilà ma méthode

  9. #9
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    La POO c'est loin d'être simple,

    Ce qu'il faut savoir avant de bazarder à tout va des classes qui n'ont ni queue ni tête,
    • Un objet est créé par instanciation d'une classe
    • Une classe est composée principalement d'attributs et de méthodes
    • Une méthode est une action liée à l'objet créé
    • Un attribut de l'objet est un qualificatif, un état, ...
    • self représente l'objet crée par instanciation de la classe


    Quand on veut passer par les classes et faire de la POO donc, il faut parler en ces termes ! Bien peser ce que chaque terme représente et les assimiler à ton problème.

    En ce qui me concerne, j'attendais un code répondant avec justesse au problème et dont tu souhaitais une modification pour le rendre lisible par un apport concret en passant par la POO. En d'autres termes, parler d'objets concrets du problème.
    Comme je l'ai dis plus haut, POO ne veut pas dire écrire des classes !

    Il faut que ta résolution de problème soit bien plus détaillée et claire sur papier, il manque des détails, ça sort du contexte et tout est à refaire... Si tu es plus précis, on risque pas de se tromper.

    Exemple :

    je classe par date d'arrivée puis je commence à poser les colis un par un dans A
    • On attend combien de temps avant de faire ce tri, 1 semaine, 1 an, ... ?
    • Pourquoi ne pas poser les colis dans la boîte dès sa réception ?


    boucle for sur l'index
    Ce n'est pas un moyen concret, on sort de la POO, là tu mélanges le français avec le langage python, c'est deux langages qui diffèrent.
    Voir plus haut les termes à employer (objet, actions sur l'objet, attributs de l'objet, ...)

    Les questions à se poser :

    1. Quels sont les différents objets de mon problème
    2. Quelles sont les actions liées à chaque objet (la méthode graphique fonctionne bien)
    3. Quels sont les attributs de l'objet (informations significatives, date d'arrivée, ouvert ou fermé, vide, plein, ...)


    L'organisation n'est pas suffisamment détaillée, propre et lisible sur papier pour être transcris en python.

    Une solution si tu persistes, et de résoudre le problème sans classe et fonctionnel... Alors dans ce cas on pourra visualiser tout aussi bien les différents détails de ton implémentation.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Citation Envoyé par Naunau75 Voir le message
    Les colis sont retirés : attributs surface du colis et attributs surface_tot de l'entrepot (surface_tot = surface_tot - surface)
    Et comme vous ne savez pas où est le colis, impossible de savoir quel "entrepot" récupère sa surface...

    Citation Envoyé par Naunau75 Voir le message
    Sur une feuille de papier, c'est simple... en fait j'ai simplifié à l'extrème l'exercice pour commencer "petit". J'ai normalement plusieurs entrepots/boites avec des étagères, etc. Faut checker sur les dimensions des colis pour savoir où les positionner.
    Pour l'instant A et B sont des capacités que l'ajout de colis consomment.... Et comme on ne sait pas ou atterrit le colis, on ne sait pas le retirer.
    Si vous vouliez simplifiez, vous pourriez remplacer vos colis par une liste de nombre entiers (les surfaces) à soustraire à la valeur initiale de A puis de B: vous n'avez fournit aucune information tangible sur quoi faire avec le reste (l'algorithme de placement, la mise à jour des dates.,...)

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

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    - je classe par date d'arrivée puis je commence à poser les colis un par un dans A (la surface disponible de la boite diminue) boucle for sur l'index
    - une fois qu'on ne peut plus mettre de colis en A, je commence à remplir B de la même façon.
    On prend les colis un par un, et on commence par la boite A. Une fois qu'elle est remplie, on passe à la B. Et à chaque fois que l'on pose un nouveau colis, on regarde avant s'il ne faut pas en enlever un (grâce à la date de départ).
    J'ai un csv :
    id,surface,date_arr,date_depart
    0,23,23/2/2018,24/05/2018
    1,10,12/3/2018,26/09/2020
    ...

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Citation Envoyé par Naunau75 Voir le message
    On prend les colis un par un, et on commence par la boite A. Une fois qu'elle est remplie, on passe à la B. Et à chaque fois que l'on pose un nouveau colis, on regarde avant s'il ne faut pas en enlever un (grâce à la date de départ).
    La date de départ? Il faudrait que la date courante change pour sortir les colis à livrer à cette date là. Ce qui libérerait de la place et permettrait de ranger les colis qui arrivent.

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

  13. #13
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    Oui j'ai dit plus haut que les colis étaient classés par ordre de date_arrivee. Les boites sont une sorte de zone de transit, on connait déjà la date à laquelle seront retirés les colis (date_depart).

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    Je suis passé sans classes :

    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
    def remplissage(surface_A, surface_B):
        # on commence par remplir A - si A est plein on remplit B
        for i in range(0, len(df['id'])):
            if surface_A >= 0:
                surface_A -= df['surface'][id]
                for j in range(0, len(df['id'])):
                    if df['date_depart'][id] < df['date_arrive'] and i > j:
                        surface_A += df['surface'][id]
                        df.drop(df.index[j], inplace = True)
            else:
                surface_B -=df['surface'][id]
                for j in range(0, len(df['id'])):
                    if df['date_depart'][id] < df['date_arrive'] and i > j:
                        surface_B += df['surface'][id]
                        df.drop(df.index[j], inplace = True)

  15. #15
    Membre émérite

    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
    Points : 2 328
    Points
    2 328
    Par défaut
    Quelques problèmes parmi d'autres dans ce code :

    - Il n'est pas fonctionnel. Nous n'avons pas tous les éléments nécéssaires pour pouvoir le faire tourner ! Mettez nous un exemple de df. Il nous faut un code qui se suffise à lui même, un code autonome.
    - Que se passe t il si dans la boite A il reste de la place, mais pas beaucoup, et que le prochain objet à placer est plus grand que la place disponible dans A ? Avec votre code vous le placer quand même dans la boite A, et vous mettez à jour le volume restant dans A, qui devient donc négatif ...
    - Qu'est censé retourner votre fonction ? Le résultat de votre algo je présume, mais là telle quelle votre fonction ne retourne rien.
    Suffit de faire print(remplissage(75,100)) pour s'en rendre conte.
    - Vous écrivez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                for j in range(0, len(df['id'])):
                    if df['date_depart'][id] < df['date_arrive'] and i > j:
    Pourquoi ne pas faire démarer j à i+1 s'il ne se passe jamais rien lorsque i<=j ?
    - et j'en passe !

  16. #16
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    Nom : Capture d’écran 2018-09-10 à 21.38.05.png
Affichages : 1038
Taille : 55,7 Ko
    voilà un df par exemple.
    Pour le soucis de la surface négative, je l'avais identifié. Je le résoudrai plus tard.
    Ce qu'on veut à la fin, c'est la surface_A et la surface_B une fois qu'on a posé tous les colis de la liste.
    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
    def remplissage(surface_A, surface_B):
        # on commence par remplir A - si A est plein on remplit B
        for i in range(0, len(df['id'])):
            if surface_A >= 0:
                surface_A -= df['surface'][id]
                for j in range(0, len(df['id'])):
                    if df['date_depart'][id] < df['date_arrive'] and i > j:
                        surface_A += df['surface'][id]
                        df.drop(df.index[j], inplace = True)
            else:
                surface_B -=df['surface'][id]
                for j in range(0, len(df['id'])):
                    if df['date_depart'][id] < df['date_arrive'] and i > j:
                        surface_B += df['surface'][id]
                        df.drop(df.index[j], inplace = True)
        return surface_A, surface_B
    Mais comme tu dis, la fonction ne marche pas et retourne un message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_value()
     
    pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_value()
     
    pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
     
    pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()
     
    pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()
     
    KeyError: 4510877736

  17. #17
    Membre émérite

    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
    Points : 2 328
    Points
    2 328
    Par défaut
    Il ne faut pas nous mettre une capture d'écran de df (enfin si, ca peut être utile) mais surtout il faut nous mettre le code permettant de générer df. Donc un truc du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import numpy as np
    import panda as pd 
     
    data = np.array([ ..... ])
    df = pd.Dataframe(data, ... )
    On pourrait le faire nous même, mais :
    - Ca prend du temps d'aider son prochain. Donc lorsqu'on veut bénéficier d'une aide, on présente tout ce qu'il faut pour que l'aide soit la plus efficace possible. C'est du temps à mettre en plus au départ quand on formule sa question , mais c'est du temps de gagner après car beaucoup moins d'échange sont nécéssaires pour permettre la résolution du problème.
    - Ca nous prendrais en plus vachement plus de temps qu'à toi, puisque nous il faudrait qu'on recopie les valeurs du tableau à la main, alors que toi tu as juste à faire un print de ton df pour avoir déjà les données au format voulu
    - Ca ne va pas te faire de mal de regarder ces données d'un peu plus près d'ailleurs, car l'erreur que tu obtiens manifeste un manque de connaissance de tes données de ta part puisque tu essaie d'accéder à des choses qui n'existe visiblement pas.

    Ton tableau est probablement gros. C'est pas grave, démarrons avec un premier de tableau de 15 lignes. Il faut déjà que ca fonctionne correctement sur un petit cas avant de regarder les gros cas.

  18. #18
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    Oui oui je comprends. En tout cas, merci de prendre du temps pour m'aider:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import numpy as np
    import pandas as pd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    d={'id':[0,1,2,3,4,5,6,7,8,9,10,11,12],'surface':[2,2,3,1,4,12,11,2.5,2,8,8,2,4],'date_arrive':['01/01/2018','02/01/2018','03/01/2018','04/01/2018','05/01/2018','06/01/2018','07/01/2018','08/01/2018','09/01/2018','10/01/2018','11/01/2018','12/01/2018','13/01/2018'],'date_depart':['05/01/2018','06/01/2018','20/02/2020','05/01/2018','17/02/2019','01/02/2019','08/12/2018','20/03/2018','12/01/2018','04/11/2023','09/09/2020','20/11/2019','12/12/2022']}
    df = pd.DataFrame(data=d)
    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
    def remplissage(surface_A, surface_B):
        # on commence par remplir A - si A est plein on remplit B
        for i in range(0, len(df['id'])):
            if surface_A >= 0:
                surface_A -= df['surface'][id]
                for j in range(0, len(df['id'])):
                    if df['date_depart'][id] < df['date_arrive'] and i > j:
                        surface_A += df['surface'][id]
                        df.drop(df.index[j], inplace = True)
            else:
                surface_B -=df['surface'][id]
                for j in range(0, len(df['id'])):
                    if df['date_depart'][id] < df['date_arrive'] and i > j:
                        surface_B += df['surface'][id]
                        df.drop(df.index[j], inplace = True)
        return surface_A, surface_B

  19. #19
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Mouais...

    • panda s'écrit pandas.
    • On ne sait pas d'où sort la variable id utilisée dans vos boucles.
    • Des comparaisons comme df['date_depart'][id] < df['date_arrive'] ne veulent rien dire (et Python n'en veut pas).


    Déjà qu'on sait pas ce que çà fait, en plus il faut "inventer" pour arriver à faire fonctionner quelque chose...

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

  20. #20
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2017
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import numpy as np
    import pandas as pd
    d={'id':[0,1,2,3,4,5,6,7,8,9,10,11,12],'surface':[2,2,3,1,4,12,11,2.5,2,8,8,2,4],'date_arrive':['01/01/2018','02/01/2018','03/01/2018','04/01/2018','05/01/2018','06/01/2018','07/01/2018','08/01/2018','09/01/2018','10/01/2018','11/01/2018','12/01/2018','13/01/2018'],'date_depart':['05/01/2018','06/01/2018','20/02/2020','05/01/2018','17/02/2019','01/02/2019','08/12/2018','20/03/2018','12/01/2018','04/11/2023','09/09/2020','20/11/2019','12/12/2022']}
    df = pd.DataFrame(data=d)
    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
    def remplissage(surface_A, surface_B):
        # on commence par remplir A - si A est plein on remplit B
        for i in range(0, len(df['id'])):
            if surface_A >= 0:
                surface_A -= df['surface'][i]
                for j in range(i, len(df['id'])):
                    if df['date_depart'][i] < df['date_arrive'][j] and i>j:
                        surface_A += df['surface'][j]
     
            else:
                surface_B -=df['surface'][i]
                for j in range(i, len(df['id'])):
                    if df['date_depart'][i] < df['date_arrive'][j] and i>j:
                        surface_B += df['surface'][j]
     
        return surface_A, surface_B

Discussions similaires

  1. simulateur gestion automatique de stocks en flux tendu
    Par buz33800 dans le forum Prolog
    Réponses: 1
    Dernier message: 06/11/2013, 09h07
  2. Gestion de stock CMUP après chaque entrée
    Par priest69 dans le forum Access
    Réponses: 9
    Dernier message: 13/12/2005, 10h03
  3. Gestion de stock - Prix Moyen Pondéré
    Par hugo69 dans le forum Access
    Réponses: 33
    Dernier message: 28/10/2005, 17h03
  4. Analyses du progiciel de gestion de stock COSWIN CS 5.2
    Par africanroseonlyone dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 13/10/2005, 15h01
  5. gestion des stocks
    Par gekondo dans le forum Access
    Réponses: 1
    Dernier message: 30/09/2005, 11h41

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