Hello !

Je viens une nouvelle fois réclamer votre aide !

Je dois faire une interface en python avec des dropdown, de l'affichage de CSV et de graph. J'utilise ipywidgets pour ça. Le but final sera d'en faire une interface web.


Premièrement, mes csv ressemblent à cela :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
Date,FS,Total,Used,Mount
2020-01-25-12-00,/dev/hd1/,350,300,/dev/mount1
2020-01-25-18-00,/dev/hd2/,370,320,/dev/mount2
2020-01-26-06-00,/dev/hd3/,395,350,/dev/mount3
2020-01-26-12-00,/dev/hd1/,350,300,/dev/mount1
2020-01-26-18-00,/dev/hd2/,370,320,/dev/mount2
2020-01-27-06-00,/dev/hd3/,395,350,/dev/mount3
2020-01-27-12-00,/dev/hd1/,350,300,/dev/mount1
2020-01-27-18-00,/dev/hd2/,370,320,/dev/mount2
2020-01-28-06-00,/dev/hd3/,395,350,/dev/mount3
2020-01-28-12-00,/dev/hd1/,350,300,/dev/mount1
2020-01-28-18-00,/dev/hd2/,370,320,/dev/mount2
2020-01-29-06-00,/dev/hd3/,395,350,/dev/mount3
J'aimerai pour voir créer un lien qui irait pointer vers un CSV dans un repertoire. Ce lien serait créé avec lex choix que l'on fait dans deux dropdowns. Un dropdown pour la liste des servers et un autre pour choisir la date. J'ai réussi à le faire de cette manière :

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
 
from ipywidgets import interact, Dropdown
from ipywidgets import widgets
from IPython.display import display
import plotly.express as px
import pandas as pd
from ipywidgets.embed import embed_minimal_html
import sys
import os
 
###################### Déclarations des widgets ######################
 
Server = os.listdir('/home/tim/Bureau/Servers/')
ServerList = widgets.Dropdown(options = (Server))
 
Date = ['2019-10', '2019-11', '2019-12', '2020-01']
DateList = widgets.Dropdown(options = (Date))
 
 
@interact(ServersList = Server, DatesList = Date)
def print_all(ServersList, DatesList):
    Test = os.listdir('/home/tim/Bureau/Servers'+ '/'+ ServersList+ '/'+ DatesList+'/')
    Path = os.path.join('/home/tim/Bureau/Servers'+ '/'+ ServersList+ '/'+ DatesList+'/' + str(Test).strip("[]").strip("''"))
    display(Path)
 
    df = pd.read_csv(Path)
    df.head()
 
 
    fig = px.line(df, x = 'Date', y = 'Total', title='DF command graph')
    fig.add_scatter(mode='markers+lines')
 
    display(df)
Le résultat est celui-ci :

Nom : ss7u.png
Affichages : 120
Taille : 19,0 Ko

Dès que je change un choix dans un des menus, le changement se fait en live dans le chemin créé et l'affichage du CSV se fait également de manière automatique.

Maintenant, l'idée serait d'ajouter un troisième dropdown qui va permettre de trier le CSV et d'afficher uniquement certaines lignes :

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
 
import ipywidgets as widgets
from ipywidgets import interactive
import pandas as pd
import plotly.graph_objects as go
import plotly.express as px
 
df = pd.read_csv('/home/tim/Bureau/Servers/Server1/2019-10/Test1.txt')
 
 
items = ['All']+sorted(df['FS'].unique().tolist())
 
 
def view(x=''):
    if x=='All': display(df)
    display(df[df['FS']==x])
 
    fig = px.line(df[df['FS']==x], x = 'Date', y ='Total', title='DF command graph')
    #fig.add_scatter(x=df['Date'], y=df['Used'])
    fig.update_traces(mode='markers+lines')
    fig.show();
 
w = widgets.Dropdown(options=items)
interactive(view, x=w)
Ici, je créé un dropdown qui se base sur la deuxième colonne de mon CSV, ce qui permet de trier et d'afficher le CSV en fonction du FS choisi puis, il affiche le graphique qui va bien :

Nom : grch.png
Affichages : 117
Taille : 66,6 Ko

J'ai réussi à faire les deux de manière séparé, mais impossible de fusionner mes deux codes dans le but d'avoir un dropdown qui va me permettre de choisir un server, un secon pour choisir la date puis un troisième qui me permettra de trier mon CSV en fonction du FS voulu pour ensuite afficher le résultat du CSV et le graphique...

Quelqu'un pourrait me montrer comment faire ça ?

N'hésitez pas à corriger mon code ou à me dire comment l'améliorer, je suis débutant en python, toutes les remarques sont bonnes à prendre !

Merci d'avance !