Bonjour, a tous; Cela fait plusieurs jours que je suis sur un problème dans mon script; le compte n'y est pas. Le but de cet algo est de compte le nombre point manquant entre deux réceptions de point (entre les heures 00h et 4h). Normalement je devrais recevoir au mieux 80 points en 4h de temps donc un point toute les 3 minutes. J'ai donc développer ce petit script qui récupère d'un base sql les data. La je met les data dans l'ordre chronologique et après je fais le calcul de point manquant. Mais voila le problème pour certaines nuit je trouve un compte bien supérieure à 80 ou inférieure à 65 (j'accepte le résultat si c'est entre 85 et 75). Cela arrive au moins à chaque début d'armoire.
Je pense qu'il y a un problème avec l’initialisation mais je ne vois pas où
Je ne suis pas un pro je début donc si vous avez des conseils mm juste pour le rendre plus propre ou plus rapide n’hésite pas je prend tout les bon conseilles. Merci et voila mon petit 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
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
 
import pyodbc, datetime, pandas as pd
delta = datetime.timedelta(minutes=3)
 
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)
cursor = cnxn.cursor().execute("SELECT  [Name] FROM [ConnexityDBProd_WithNotifs_20182404].[dbo].[Devices]")
for row in cursor :
    list_armoire.append(row[0])
 
for armoire in list_armoire :
    """on met les data en memoire dans df """
    df = pd.read_sql("SELECT [DeviceCode],[SensorName],[CalculatedValue],[SentDateTime] FROM [ConnexityDBProd_WithNotifs_20182404].[dbo].[V_MeasuresIOSensors] WHERE [TypeUnit] = 'KiloWatt' and [DeviceName] = '"+ armoire +"' and [SensorName] = 'Phase 1'",cnxn)
    """on tri les data de df par ordre chronologique"""
    df = df.sort_values(by='SentDateTime')
    """on peut maintenant voir si l armoire envoi assez souvent des donnees pour etre utilisee dans les futur algo"""
    inisialisation = True
    fin_boucle = False
    Dict_Value_date = {}
    List_test = []
    compteur_taille = 0
    for data in df.itertuples() :
        id_armoire = data.DeviceCode
        compteur_taille += 1
        """mise en forme de la date """
        date_time = datetime.datetime.strptime(data.SentDateTime[:-11], '%Y-%m-%d %H:%M')
        """seul les points entre 00h et 03h nous interesse pour le moment si nuit complete necessite de modifier le code car on prend les heures du debut de la nuit le jours avant la fin de la nuit"""
        if date_time.hour in [0,1,2,3] or compteur_taille == len(df):
            """inisialisation pour la première fois dans la condition"""
            if inisialisation == True :
                temps0 = datetime.datetime.strptime(str(date_time.date())+' 00:00', '%Y-%m-%d %H:%M')
                temps1 = date_time
                temps_fin = date_time
                compteur_recu = 0
                compteur_manquant = 0
                Max_manquant = 0
                inisialisation = False
                Nuit_monopoint = False
                """verification qu on oubli pas le dernier point a remplissant la condition"""
            elif compteur_taille == len(df) :
                if temps1.date != temps_fin :
                    compteur_recu = 0
                    compteur_manquant = 0
                    Max_manquant = 0
                    deltatps = temps_fin - datetime.datetime.strptime(str(temps_fin.date())+' 00:00', '%Y-%m-%d %H:%M')
                    deltatps1 = datetime.datetime.strptime(str(temps_fin.date())+' 04:00', '%Y-%m-%d %H:%M') - temps_fin
                    compteur_recu += 1
                else : 
                    deltatps = temps_fin - temps1
                    deltatps1 = datetime.datetime.strptime(str(temps_fin.date())+' 04:00', '%Y-%m-%d %H:%M') - temps_fin
                    compteur_recu += 1
                if deltatps > delta :
                    nbr_manquant = (deltatps//delta)-1
                    compteur_manquant += nbr_manquant
                    if nbr_manquant > Max_manquant :
                        Max_manquant = nbr_manquant
                if deltatps1 > delta :
                    nbr_manquant = (deltatps1//delta)-1
                    compteur_manquant += nbr_manquant
                    if nbr_manquant > Max_manquant :
                        Max_manquant = nbr_manquant
                Dict_Value_date[(data.DeviceCode,str(temps_fin.date()))]=[compteur_recu,compteur_manquant,Max_manquant ]
            else :    
                if temps0.date() != temps1.date() :
                    compteur_recu = 0
                    compteur_manquant = 0
                    Max_manquant = 0
                    """debut de nuit"""
                    if temps1.date() == date_time.date():
                        deltatps = temps1 - datetime.datetime.strptime(str(temps1.date())+' 00:00', '%Y-%m-%d %H:%M')
                        compteur_recu += 1
                    """nuit a un point"""
                    if temps1.date() != date_time.date() :
                        deltatps = temps1 - datetime.datetime.strptime(str(temps1.date())+' 00:00', '%Y-%m-%d %H:%M')
                        deltatps1 = datetime.datetime.strptime(str(temps1.date())+' 04:00', '%Y-%m-%d %H:%M') - temps1  
                        compteur_recu += 1
                        Nuit_monopoint =  True
                if temps0.date() == temps1.date() :
                    """nuit a plusieurs points"""
                    if temps1.date() == date_time.date() and temps1.time() != temps0.time() :
                        deltatps = temps1 - temps0
                        compteur_recu += 1
                    """fin de nuit"""
                    if temps1.date() != date_time.date() :  
                        deltatps += datetime.datetime.strptime(str(temps1.date())+' 04:00', '%Y-%m-%d %H:%M') - temps1
                        compteur_recu += 1
                """on calcule les points manquants"""
                if deltatps > delta :
                    nbr_manquant = (deltatps//delta)-1
                    compteur_manquant += nbr_manquant
                    if nbr_manquant > Max_manquant :
                        Max_manquant = nbr_manquant
                    if Nuit_monopoint == True and deltatps1 > delta :
                        Nuit_monopoint = False
                        nbr_manquant = (deltatps1//delta)-1
                        compteur_manquant += nbr_manquant
                        if nbr_manquant > Max_manquant :
                            Max_manquant = nbr_manquant
                Dict_Value_date[(data.DeviceCode,str(temps1.date()))]=[compteur_recu,compteur_manquant,Max_manquant ]
                List_test.append((str(temps0),str(temps1),str(date_time)))
            temps0 = temps1
            temps1 = date_time
            temps_fin = date_tim
Et voila le résultat :
(('sbox001760', '2018-02-24'), [19, 135, 75]) > 80 points (19+135)
(('sbox001760', '2018-02-25'), [13, 67, 17]) ~ 80 points (13+67)
(('sbox001760', '2018-02-26'), [13, 65, 18]) ~ 80 points (13+67)
(('sbox001760', '2018-02-27'), [22, 54, 9]) ~ 80 points (13+67)
(('sbox001760', '2018-03-01'), [17, 53, 16]) <80 points (13+57)
.....