Problème Génération graphique Dash (Python)

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

EDIT : L’erreur était débile ce sujet peut être fermé ==> Je bouclais une fois de trop et numpy donnait des coefficient "presque" entier (4.999999999999 au lieu de 5 par exemple) Bonjour à tous,

Dans le cadre de mon taff j’essaye de générer depuis une BDD des Burndown de l’avancée de chacune des EPICs de notre planning Agile.

Mon programme se coupera en deux : un script lancé quotidiennement pour aller récupéré dans l’API de notre outil l’avancement de chaque EPIC et un dashboard qui lit cette BDD et va générer un Dashboard

J’ai pris la librairie Dash qui semblait faire l’unanimité pour ca sur pas mal de site cependant je recontre un problème très con (je sais qu’il y a une erreur mais même après 5 relecture je ne la vois pas ) : Dans mes burndown la droite "optimale" n’arrive pas à 0

Voici le code de mon app.py :

# -*- coding: utf-8 -*-
import dash
import dash_core_components as dcc
import dash_html_components as html
import sqlite3
import numpy as np
#import des données depuis la BDD (test avec SQLite)
connexion = sqlite3.connect("test.db")
curseur = connexion.cursor()
curseur.execute('''SELECT * FROM epic''')
resultat = curseur.fetchall()
gigaDico = {}
for elt in resultat:
    idEpic = elt[0]
    epicNom = elt[1]
    workload= elt[2]
    startDate = elt[3]
    endDate = elt[4]
    gigaDico[epicNom]={'dateDebut':startDate,'dateFin':endDate,'workload':workload,'releve':{}}
    curseur.execute("SELECT * FROM releve WHERE id_epic=?",(elt[0],))
    resultats = curseur.fetchall()
    i=1
    for elt in resultats:
        dateReleve = elt[3]
        restant = elt[2]
        gigaDico[epicNom]['releve'][i]=(dateReleve,restant)
        i+=1
connexion.close()

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
output=[]
#Ajout du titre
output.append(html.H1(
        children='Dashboard Neurone',
        style={
            'textAlign': 'center',
            'color': '#7FDBFF'
        }
    ))
#Génération des Burndown pour chaque EPIC présente en base
for key in gigaDico:
    listeX=[]
    listeY=[]
    data = gigaDico[key]['releve']
    dateA= gigaDico[key]['dateDebut']
    dateB= gigaDico[key]['dateFin']
    workDebut = gigaDico[key]['workload']
    for elt in data:
        tupleTempo = data[elt]
        listeX.append(tupleTempo[0])
        listeY.append(tupleTempo[1])
    nb_IT = len(listeX)
    point1=[0,workDebut]
    point2=[nb_IT,0]
    coefficients = np.polyfit(point1, point2, 1)
    a=coefficients[0]
    b=coefficients[1]
    listeYOptim=[]
    x=0
    while x <=nb_IT:
        valeur = (a*x)+b
        listeYOptim.append(valeur)
        x+=1
    output.append(
        dcc.Graph(
            figure=dict(
            data=[
                dict(
                    x=listeX,
                    y=listeYOptim,
                    name='Optimal',
                    marker=dict(
                        color='rgb(0, 255, 0)'
                    )
                ),
                dict(
                    x=listeX,
                    y=listeY,
                    name='Réalité',
                    marker=dict(
                        color='rgb(26, 118, 255)'
                    )
                )
            ],
            layout=dict(
                title='Burndown '+str(key),
                showlegend=True,
                plot_bgcolor='#111111',
                paper_bgcolor='#111111',
                font = {
                    'color': '#7FDBFF'
                },
                xaxis=dict(title='Date'),
                yaxis=dict(title='Workload'),
                legend=dict(
                    x=0,
                    y=0.1
                ),
                margin=dict(l=40, r=0, t=40, b=30)
            )
        ),
        style={'height': 300, 'width:':'50%','backgroundColor': '#111111', 'margin':'2%',"border":"1px solid grey"},
        id='burwdown_'+str(key)
    ) 
    )

app.layout = html.Div(style={'backgroundColor': '#111111'}, children=output)
if __name__ == '__main__':
    app.run_server(debug=True)

Pour ceux n’étant pas habitué a ce type de graphique en gestion Agile : la droite Optimale permet de savoir la charge de travail parfaite pour passer de (Debut,Charge de travail totale a (Date fin prévue,charge de travail a 0)

Conaissant ces deux points j’ai décidé d’utiliser numpy pour calculer le coefficient de la droite et pouvoir calculer les points intermédiaire . Cependant la droite s’arrete a 1 en dernier point et non a zero :

Pour info la BDD est ultra simple :

Table EPIC :

Table releve:

J’ai beau chercher je ne comprend pas où j’ai commis une erreur :o

Merci mille fois à ceux qui pourront m’aider :D

Édité par alliocha1805

+0 -0

Cette réponse a aidé l’auteur du sujet

Salut,

nb_IT = len(listeX)
point1=[0,workDebut]
point2=[nb_IT,0]
coefficients = np.polyfit(point1, point2, 1)
a=coefficients[0]
b=coefficients[1]
listeYOptim=[]
x=0
while x <=nb_IT:
    valeur = (a*x)+b
    listeYOptim.append(valeur)
    x+=1

Ce morceaux de code est plus compliqué que nécessaire.

Je te propose cette simplification (aux histoires d’indices près, il faut peut-être écrire des nb_IT - 1, je n’ai pas regardé de près). Tu n’as plus besoin de numpy (faire une régression pour une droite passant par deux points !?) et c’est plus court et lisible.

nb_IT = len(listeX)
a = -workDebut/nb_IT
b = workDebut
listeYOptim = [a*x + b for x in range(nb_IT+1)]

Je passe sur tes conventions de nommage peu… conventionnelles.

+0 -0
Auteur du sujet

J’avais résolu le souci mais merci de l’aide pour améliorer tout ca :)

Après ca reste juste un POC pour montrer a des collegues ce qu’on pourrait faire : au final si c’est accepté ca sera redeveloppé en Java par mon équipe et pas par moi :)

Je note cependant la simplification pour ma culture perso :D

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte