Module DateFab_NumTombee_Dataset

Expand source code
#################################################
### THIS FILE WAS AUTOGENERATED! DO NOT EDIT! ###
#################################################
# file to edit: 00 - Class DateFab_NumTombee_Dataset.ipynb

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

from bokeh.io import show, output_notebook
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure
from bokeh.transform import jitter
from bokeh.models import HoverTool
from bokeh.models import Legend, LegendItem
from math import pi

from IPython.display import set_matplotlib_formats
set_matplotlib_formats('png', 'pdf')

import os.path, platform





from exp.init_D059 import *
check_SECU()


class DateFab_NumTombee_Dataset:
    '''Pour stocker les datasets contenant les clés Date_Fab et Num_Tombee'''
    def __init__(self, dataset, name, description=''):
        '''
        les attributs:
        - dataset : une copie du dataframe, on supprime les vrais doublons (2 lignes strictement identiques)
        - name : le nom (abrégé) du dataframe
        - description : une description en quelques mots
        '''
        self.dataset = dataset.copy()
        self.name = name
        self.description = description
        # on supprime les lignes dupliquées: 2 lignes strictement identiques
        self.dataset.drop_duplicates(inplace=True)

    def get_info(self):
        '''retourne le nom, la description du dataset'''
        return f"\n Dataset {self.name} [{self.description}]\n"

    def get_shape(self):
        '''retourne le nombre de lignes et colonnes du dataset'''
        return f" - shape : ({self.dataset.shape})\n"

    def get_dates(self):
        '''retourne l'amplitude temporelle de Date_Fab du dataset'''
        return f" - amplitude temporelle : ({self.dataset.Date_Fab.min()} - {self.dataset.Date_Fab.max()})\n"

    def __repr__(self):
        '''retourne get_info quand évalué directement'''
        return self.get_info()

    def __str__(self):
        '''retourne get_info, get_shape, get_dates dans un print(<DateFab_NumTombee_Dataset>)'''
        return self.get_info()+self.get_shape()+self.get_dates()+'\n'

    def get_duplicates(self, keep=False):
        '''retourne les lignes du dataset qui contiennent des doublons sur la base de la clé
        Date_Fab, Num_Tombee
        keep{‘first’, ‘last’, False}, default ‘False’
            Determines which duplicates (if any) to mark.
            first : Mark duplicates as True except for the first occurrence.
            last : Mark duplicates as True except for the last occurrence.
            False : Mark all duplicates as True.
        '''
        return self.dataset.loc[self.dataset.duplicated(subset=['Num_Tombee', 'Date_Fab'], keep=keep)]

    def _create_tempo_df(self, dataset_copy):
        '''
        fonction technique (pas à appeler directement)
        à partir d'un dataset qui contient
        les colonnes date_week, date_year
        crée un dataframe dense de 0 de la 1ere semaine à la derniere
        (c'est uniquement pour completer les density plots : plot_density_per_week, plot_density_per_week_bokeh, comparaison_plot_density)
        '''
        if (dataset_copy.shape[0]==0):
            return pd.DataFrame()
        debut_annee=dataset_copy['date_year'].min()
        fin_annee=dataset_copy['date_year'].max()
        debut_semaine=dataset_copy.loc[dataset_copy['date_year'] == debut_annee]['date_week'].min()
        fin_semaine=dataset_copy.loc[dataset_copy['date_year'] == fin_annee]['date_week'].max()
        liste_tempo = []
        for annee in range(debut_annee, fin_annee+1):
            deb_sem = 1
            fin_sem = 52
            if (annee == debut_annee):
                deb_sem = debut_semaine
            if (annee == fin_annee):
                fin_sem = fin_semaine
            for sem in range(deb_sem, fin_sem+1):
                liste_tempo.append([annee, sem, 0, 0])
        liste_tempo_df = pd.DataFrame(liste_tempo, columns =['date_year', 'date_week', 'Unique', 'Doublons']).set_index(['date_year', 'date_week'])
        return liste_tempo_df


    def plot_density_per_week_matplotlib(self, without_duplicate=False):
        '''affiche le nombre d'observations par semaine
        si without_duplicate=True, on drop les doublons sur le critere ['Num_Tombee', 'Date_Fab']
        sinon on les affiche en rouge (par défaut)
        '''
        dataset_copy = self.dataset.copy()
        if (without_duplicate):
            dataset_copy.drop_duplicates(subset=['Date_Fab', 'Num_Tombee'], inplace=True)
        # add columns for week and year of the date
        dataset_copy['date_week'] = dataset_copy['Date_Fab'].apply(lambda x: x.isocalendar()[1])
        dataset_copy['date_year'] = dataset_copy['Date_Fab'].apply(lambda x: x.isocalendar()[0])

        dataset_unique = dataset_copy.drop_duplicates(subset=['Date_Fab', 'Num_Tombee'])
        dataset_doublon = dataset_copy.loc[dataset_copy.index.difference(dataset_unique.index)]
        groupage_unique = dataset_unique.groupby([dataset_unique['date_year'],dataset_unique['date_week']])['Num_Tombee'].count()
        groupage_doublon = dataset_doublon.groupby([dataset_doublon['date_year'],dataset_doublon['date_week']])['Num_Tombee'].count()

        graph_rft = pd.concat([groupage_unique, groupage_doublon], axis=1)
        graph_rft.columns=['Unique', 'Doublons']
        graph_rft=graph_rft[['Unique', 'Doublons']]

        graph_rft=graph_rft.reindex(self._create_tempo_df(dataset_copy).index)

        colors = ["green" , "red"]
        barWidth = 0.85
        graph_rft.plot.bar(stacked=True, color=colors, figsize=(17,7),width=barWidth)
        plt.show()

    def plot_density_per_week(self, without_duplicate=False):
        '''affiche le nombre d'observations par semaine
        si without_duplicate=True, on drop les doublons sur le critere ['Num_Tombee', 'Date_Fab']
        sinon on les affiche en rouge (par défaut)
        '''
        dataset_copy = self.dataset.copy()
        if (without_duplicate):
            dataset_copy.drop_duplicates(subset=['Date_Fab', 'Num_Tombee'], inplace=True)
        # add columns for week and year of the date
        dataset_copy['date_week'] = dataset_copy['Date_Fab'].apply(lambda x: x.isocalendar()[1])
        dataset_copy['date_year'] = dataset_copy['Date_Fab'].apply(lambda x: x.isocalendar()[0])

        dataset_unique = dataset_copy.drop_duplicates(subset=['Date_Fab', 'Num_Tombee'])
        dataset_doublon = dataset_copy.loc[dataset_copy.index.difference(dataset_unique.index)]
        groupage_unique = dataset_unique.groupby([dataset_unique['date_year'],dataset_unique['date_week']])['Num_Tombee'].count()
        groupage_doublon = dataset_doublon.groupby([dataset_doublon['date_year'],dataset_doublon['date_week']])['Num_Tombee'].count()

        graph_rft = pd.concat([groupage_unique, groupage_doublon], axis=1)
        graph_rft.columns=['Unique', 'Doublons']
        graph_rft=graph_rft[['Unique', 'Doublons']]

        graph_rft=graph_rft.reindex(self._create_tempo_df(dataset_copy).index)
        graph_rft=graph_rft.reset_index(level=[0,1])
        graph_rft['index']=graph_rft['date_year'].apply(str)+'-'+graph_rft['date_week'].apply(str)
        graph_rft.fillna(0, inplace=True)
        graph_rft['total']=graph_rft['Unique']+graph_rft['Doublons']
    #     graph_rft['index']=graph_rft['index'].astype('int64')
        graph_rft.set_index(['index'], inplace=True)

        graph_rft.drop(['date_year', 'date_week'], axis=1, inplace=True)

    #     return graph_rft

        colors = ["green" , "red"]
        barWidth = 0.7
    #         graph_rft.plot.bar(stacked=True, color=colors, figsize=(17,7),width=barWidth)
    #         plt.show()

        output_notebook()
        TOOLS = "xpan,xwheel_zoom,crosshair, reset,save"

        p = figure(x_range=list(graph_rft.index), title="Density plot "+self.name,
                   tools=TOOLS, active_scroll='xwheel_zoom', plot_width=900, plot_height=500)
        v = p.vbar_stack(['Unique', 'Doublons'], x='index', width=barWidth, color=colors,
                     source=graph_rft, line_color=None)

        tooltips = [
            ("Total ", "@total"),
            ("Unique ", "@Unique"),
            ("Doublons ", "@Doublons"),
            ('# de semaine ', "@index")
        ]

        hover = HoverTool(tooltips=tooltips)
        p.add_tools(hover)
    #     item1 = LegendItem({'label':'Unique', 'renderers':[p.renderers[0]]});
    #     item2 = LegendItem({'label':'Doublons', 'renderers':[p.renderers[1]]});
    #     legend = Legend(items=[item1, item2])
    #     p.add_layout(legend)

        legend=Legend(items=[
            ("Unique",   [v[0]]),
            ("Doublons",   [v[1]])
        ], location=(0, -30))
        p.add_layout(legend)

        p.legend.orientation = "horizontal"
        p.legend.location = "top_center"
        p.legend.click_policy="hide"

        p.xaxis.major_label_orientation = 3*pi/8
        p.xaxis.axis_label_text_font_size = "5pt"
        p.xaxis.major_label_text_font_size = "5pt"
        p.xaxis.axis_label_text_font = "times"
        p.xaxis.axis_label_text_color = "black"

        show(p)

    def extraire_periode(self, date_debut, date_fin):
        '''
        retourne un objet DateFab_NumTombee_Dataset
        en ne gardant le contenu du dataset obéissant à date_debut<= Date_Fab <= date_fin

        les dates peuvent être à structure variable: '2021' (année), '2021-01' (mois), '2021-05-23' (jour)
        '''
        sous_dataset=self.dataset.copy()[(self.dataset.Date_Fab >= pd.to_datetime(date_debut))
                                                     & (self.dataset.Date_Fab <= pd.to_datetime(date_fin))]
        nouveauDateFab_NumTombee_Dataset = DateFab_NumTombee_Dataset(sous_dataset, self.name, self.description+f' filtré entre {date_debut} et {date_fin}.')
        return nouveauDateFab_NumTombee_Dataset


    def comparaison(self, autreDateFab_NumTombee_Dataset):
        '''retourne 3 objets DateFab_NumTombee_Dataset dont les datasets sont:
        - dataset_commun - c'est l'intersection des index (Date_Fab, Num_Tombee) de self et autreDateFab_NumTombee_Dataset
        - dataset_difference_gauche - c'est la difference des index (Date_Fab, Num_Tombee) de self et
                                        autreDateFab_NumTombee_Dataset en partant de self
        - dataset_difference_droite - c'est la difference des index (Date_Fab, Num_Tombee) de self et
                                        autreDateFab_NumTombee_Dataset en partant de autreDateFab_NumTombee_Dataset
        '''
        index_commun = self.dataset.set_index(['Date_Fab', 'Num_Tombee']).index.intersection(autreDateFab_NumTombee_Dataset.dataset.set_index(['Date_Fab', 'Num_Tombee']).index)
        index_gauche = self.dataset.set_index(['Date_Fab', 'Num_Tombee']).index.difference(autreDateFab_NumTombee_Dataset.dataset.set_index(['Date_Fab', 'Num_Tombee']).index)
        index_droite = autreDateFab_NumTombee_Dataset.dataset.set_index(['Date_Fab', 'Num_Tombee']).index.difference(self.dataset.set_index(['Date_Fab', 'Num_Tombee']).index)

        if (len(index_commun)==0):
            dataset_commun=pd.DataFrame(columns=self.dataset.columns)
        else:
            dataset_commun = self.dataset.set_index(['Date_Fab', 'Num_Tombee']).loc[index_commun].reset_index()

        if (len(index_gauche)==0):
            dataset_difference_gauche = pd.DataFrame(columns=self.dataset.columns)
        else:
            dataset_difference_gauche = self.dataset.set_index(['Date_Fab', 'Num_Tombee']).loc[index_gauche].reset_index()

        if (len(index_droite)==0):
            dataset_difference_droite = pd.DataFrame(columns=autreDateFab_NumTombee_Dataset.dataset.columns)
        else:
            dataset_difference_droite = autreDateFab_NumTombee_Dataset.dataset.set_index(['Date_Fab', 'Num_Tombee']).loc[index_droite].reset_index()

        dataset_commun_obj = DateFab_NumTombee_Dataset(dataset_commun, self.name+' inter '+autreDateFab_NumTombee_Dataset.name, 'Intersection des 2 datasets : \n'+self.description+'\n'+autreDateFab_NumTombee_Dataset.description)
        dataset_difference_gauche_obj = DateFab_NumTombee_Dataset(dataset_difference_gauche, self.name+' diff '+autreDateFab_NumTombee_Dataset.name, 'Différence des 2 datasets : \n'+self.description+'\n'+autreDateFab_NumTombee_Dataset.description)
        dataset_difference_droite_obj = DateFab_NumTombee_Dataset(dataset_difference_droite, autreDateFab_NumTombee_Dataset.name+' diff '+self.name, 'Différence des 2 datasets : \n'+autreDateFab_NumTombee_Dataset.description+'\n'+self.description)
        print(f'couverture commune : {100*dataset_commun_obj.dataset.shape[0]/(dataset_commun_obj.dataset.shape[0]+dataset_difference_gauche_obj.dataset.shape[0]+dataset_difference_droite_obj.dataset.shape[0]):0.02f} %')
        return dataset_commun_obj, dataset_difference_gauche_obj, dataset_difference_droite_obj


    def comparaison_plot_density_matplotlib(self, autreDateFab_NumTombee_Dataset):
        '''affiche le nombre d'observations par semaine
        3 informations :
        - en bleu : les données uniquement dans self
        - en vert: les données (index) communes aux 2 datasets
        - en rouge : les données uniquement dans autreDateFab_NumTombee_Dataset
        '''
        obj_commun, obj_gauche, obj_droite = self.comparaison(autreDateFab_NumTombee_Dataset)
        for dataset in [obj_commun.dataset, obj_gauche.dataset, obj_droite.dataset]:
            # add columns for week and year of the date
            dataset['date_week'] = dataset['Date_Fab'].apply(lambda x: x.isocalendar()[1])
            dataset['date_year'] = dataset['Date_Fab'].apply(lambda x: x.isocalendar()[0])

        groupage_commun = obj_commun.dataset.groupby([obj_commun.dataset['date_year'],obj_commun.dataset['date_week']])['Num_Tombee'].count()
        groupage_gauche = obj_gauche.dataset.groupby([obj_gauche.dataset['date_year'],obj_gauche.dataset['date_week']])['Num_Tombee'].count()
        groupage_droite = obj_droite.dataset.groupby([obj_droite.dataset['date_year'],obj_droite.dataset['date_week']])['Num_Tombee'].count()


        graph_rft = pd.concat([groupage_gauche, groupage_commun, groupage_droite], axis=1)
        graph_rft.columns=[obj_gauche.name, obj_commun.name, obj_droite.name]
        graph_rft=graph_rft[[obj_gauche.name, obj_commun.name, obj_droite.name]]

        graph_rft=graph_rft.reindex(self._create_tempo_df(obj_commun.dataset).index.union(self._create_tempo_df(obj_gauche.dataset).index.union(self._create_tempo_df(obj_droite.dataset).index)))

        colors = ["blue", "green" , "red"]
        barWidth = 0.85
        graph_rft.plot.bar(stacked=True, color=colors, figsize=(17,7),width=barWidth)
        plt.show()

    def comparaison_plot_density(self, autreDateFab_NumTombee_Dataset):
        '''affiche le nombre d'observations par semaine
        3 informations :
        - en bleu : les données uniquement dans self
        - en vert: les données (index) communes aux 2 datasets
        - en rouge : les données uniquement dans autreDateFab_NumTombee_Dataset
        '''
        obj_commun, obj_gauche, obj_droite = self.comparaison(autreDateFab_NumTombee_Dataset)

        for dataset in [obj_commun.dataset, obj_gauche.dataset, obj_droite.dataset]:
            # add columns for week and year of the date
            if (dataset.empty):
                dataset['date_week'] = dataset['Date_Fab']
                dataset['date_year'] = dataset['Date_Fab']
            else:
                dataset['date_week'] = dataset['Date_Fab'].apply(lambda x: x.isocalendar()[1])
                dataset['date_year'] = dataset['Date_Fab'].apply(lambda x: x.isocalendar()[0])

        groupage_commun = obj_commun.dataset.groupby([obj_commun.dataset['date_year'],obj_commun.dataset['date_week']])['Num_Tombee'].count()
        groupage_gauche = obj_gauche.dataset.groupby([obj_gauche.dataset['date_year'],obj_gauche.dataset['date_week']])['Num_Tombee'].count()
        groupage_droite = obj_droite.dataset.groupby([obj_droite.dataset['date_year'],obj_droite.dataset['date_week']])['Num_Tombee'].count()


        graph_rft = pd.concat([groupage_gauche, groupage_commun, groupage_droite], axis=1)
        graph_rft.columns=[obj_gauche.name, obj_commun.name, obj_droite.name]
        graph_rft=graph_rft[[obj_gauche.name, obj_commun.name, obj_droite.name]]

        graph_rft=graph_rft.reindex(self._create_tempo_df(obj_commun.dataset).index.union(self._create_tempo_df(obj_gauche.dataset).index.union(self._create_tempo_df(obj_droite.dataset).index)))

        colors = ["blue", "green" , "red"]
        barWidth = 0.85
    #     graph_rft.plot.bar(stacked=True, color=colors, figsize=(17,7),width=barWidth)
    #     plt.show()
        graph_rft=graph_rft.reset_index(level=[0,1])
        graph_rft['index']=graph_rft['date_year'].apply(str)+'-'+graph_rft['date_week'].apply(str)
        graph_rft.fillna(0, inplace=True)

        graph_rft['total']=graph_rft[graph_rft.columns[2]]+graph_rft[graph_rft.columns[3]]+graph_rft[graph_rft.columns[4]]
    #     graph_rft['index']=graph_rft['index'].astype('int64')
        graph_rft.set_index(['index'], inplace=True)

        graph_rft.drop(['date_year', 'date_week'], axis=1, inplace=True)
    #     return graph_rft

    #     return graph_rft

    #     colors = ["green" , "red"]
        barWidth = 0.7
    #         graph_rft.plot.bar(stacked=True, color=colors, figsize=(17,7),width=barWidth)
    #         plt.show()

        graph_rft.columns=['gauche', 'commun', 'droite', 'total']

        output_notebook()
        TOOLS = "xpan,xwheel_zoom,crosshair, reset,save"

        p = figure(x_range=list(graph_rft.index), title="Density plot "+self.name+" vs "+autreDateFab_NumTombee_Dataset.name,
                   tools=TOOLS, active_scroll='xwheel_zoom', plot_width=900, plot_height=500)
        v = p.vbar_stack(['gauche', 'commun', 'droite'], x='index', width=barWidth, color=colors,
                     source=graph_rft, line_color=None)



        tooltips = [
            ("Total ", "@total"),
            (obj_gauche.name, "@gauche"),
            (obj_commun.name, "@commun"),
            (obj_droite.name, "@droite"),
            ('# de semaine ', "@index")
        ]

        hover = HoverTool(tooltips=tooltips)
        p.add_tools(hover)
    #     item1 = LegendItem({'label':'Unique', 'renderers':[p.renderers[0]]});
    #     item2 = LegendItem({'label':'Doublons', 'renderers':[p.renderers[1]]});
    #     legend = Legend(items=[item1, item2])
    #     p.add_layout(legend)

        legend=Legend(items=[
            (obj_gauche.name,   [v[0]]),
            (obj_commun.name,   [v[1]]),
            (obj_droite.name,   [v[2]])
        ], location=(0, -30))
        p.add_layout(legend)

        p.legend.orientation = "horizontal"
        p.legend.location = "top_center"
        p.legend.click_policy="hide"

        p.xaxis.major_label_orientation = 3*pi/8
        p.xaxis.axis_label_text_font_size = "5pt"
        p.xaxis.major_label_text_font_size = "5pt"
        p.xaxis.axis_label_text_font = "times"
        p.xaxis.axis_label_text_color = "black"

        show(p)

    def plot(self, date_debut=None, date_fin=None):
        '''affichage interactif des num_tombee en fonction de la date de fab
        en precisant date_debut et date_fin, on vient resserrer la fenetre de visualisation
        les dates peuvent être à structure variable: '2021' (année), '2021-01' (mois), '2021-05-23' (jour)
        '''
        dataset_copy = self.dataset.copy()
        if (date_debut==None):
            date_debut=dataset_copy.Date_Fab.min()
        if (date_fin==None):
            date_fin=dataset_copy.Date_Fab.max()

        output_notebook()
        source_donnees = ColumnDataSource(dataset_copy[(dataset_copy.Date_Fab >= pd.to_datetime(date_debut))
                                                     & (dataset_copy.Date_Fab <= pd.to_datetime(date_fin))])
        TOOLS = "xpan,xwheel_zoom,box_zoom,crosshair, reset,save"
        p = figure(x_axis_type='datetime', active_scroll='xwheel_zoom', tools=TOOLS,plot_width=900, plot_height=500)

        p.line(x='Date_Fab', y='Num_Tombee', source=source_donnees)

        p.circle(x='Date_Fab', y='Num_Tombee', size=3, line_color="green",
                 fill_color="white", line_width=1, source=source_donnees, legend_label=self.name)

        hover = HoverTool(tooltips=[('Date tombée','@Date_Fab{%Y-%m-%d %H:%M:%S}'),
                                ('Num tombée', '@Num_Tombee')],
                      formatters={'@Date_Fab':'datetime'})
        p.add_tools(hover)
        p.title.text = "Num_tombee en fonction de la date"
        show(p)

    def comparaison_plot(self, autreDateFab_NumTombee_Dataset, date_debut=None, date_fin=None):
        '''affichage interactif des num_tombee en fonction de la date de fab
        pour les 3 datasets retournés par comparaison
        '''
        dataset_copy = self.dataset.copy()
        if (date_debut==None):
            date_debut=dataset_copy.Date_Fab.min()
        if (date_fin==None):
            date_fin=dataset_copy.Date_Fab.max()

        dataset_commun_obj, dataset_difference_gauche_obj, dataset_difference_droite_obj = self.extraire_periode(date_debut, date_fin).comparaison(autreDateFab_NumTombee_Dataset.extraire_periode(date_debut, date_fin))

        output_notebook()
        source_donnees_commun = ColumnDataSource(dataset_commun_obj.dataset)
        source_donnees_droite = ColumnDataSource(dataset_difference_droite_obj.dataset)
        source_donnees_gauche = ColumnDataSource(dataset_difference_gauche_obj.dataset)

        TOOLS = "xpan,xwheel_zoom,box_zoom,crosshair, reset,save"
        p = figure(x_axis_type='datetime', active_scroll='xwheel_zoom', tools=TOOLS,plot_width=900, plot_height=500)

#         p.line(x='Date_Fab', y='Num_Tombee', source=source_donnees)

        p.circle(x='Date_Fab', y='Num_Tombee', size=3, line_color="green",
                 fill_color="white", line_width=1, source=source_donnees_commun, legend_label=dataset_commun_obj.name)
        p.circle(x='Date_Fab', y='Num_Tombee', size=3, line_color="red",
                 fill_color="white", line_width=1, source=source_donnees_droite, legend_label=dataset_difference_droite_obj.name)
        p.circle(x='Date_Fab', y='Num_Tombee', size=3, line_color="blue",
                 fill_color="white", line_width=1, source=source_donnees_gauche, legend_label=dataset_difference_gauche_obj.name)

        hover = HoverTool(tooltips=[('Date tombée','@Date_Fab{%Y-%m-%d %H:%M:%S}'),
                                ('Num tombée', '@Num_Tombee')],
                      formatters={'@Date_Fab':'datetime'})
        p.add_tools(hover)
        p.title.text = "Num_tombee en fonction de la date"
        p.legend.click_policy="hide"
        show(p)



class STAM(DateFab_NumTombee_Dataset):
    '''
    Hérite de DateFab_NumTombee_Dataset
    (Pour stocker les datasets contenant les clés Date_Fab et Num_Tombee)
    Date_Fab_complet est horodatée et permet de faire des passages entre date calendaire et date michelin
    Date_Fab_complet est créé à l'initialisation
    Date_Fab n'est pas horodaté
    '''
    def __init__(self, dataset, name, description='', date_calendaire = False):
        '''
        les attributs:
        - dataset : une copie du dataframe
        - name : le nom (abrégé) du dataframe
        - description : une description en quelques mots
        - date_calendaire : False si les dates sont stockées en date Michelin, True si stockées en date Calendaire
        '''
        super().__init__(dataset, name, description)
        self._create_dtdate_fom_datecomplet()
        self.date_calendaire= date_calendaire

    def get_info(self):
        '''get_info de DateFab_NumTombee_Dataset complété avec l'info de date_calendaire'''
        return super().get_info()+' '+f'Date calendaire: [{self.date_calendaire}]\n'

    def _create_dtdate_fom_datecomplet(self):
        '''
        fonction technique (pas appelable directement)
        si la colonne Date_Fab_complet existe déjà, on est dans le cas d'un dataset CLEAN
        donc on ne fait rien
        '''
        if not ('Date_Fab_complet' in self.dataset.columns):
            self.dataset['Date_Fab_complet']=self.dataset['Date_Fab']
            self.dataset['Date_Fab']=self.dataset['Date_Fab_complet'].dt.date
            self.dataset['Date_Fab']=self.dataset['Date_Fab'].astype('datetime64')

    def passage_date_Calendaire(self, heureEquipeA = 6):
        '''
        passe en heure calendaire depuis une heure Michelin
        seulement si date_calendaire == False

        pour info: la journée Michelin est incrémentée non pas à minuit mais en debut d'équipe A
        Dates Michelin:
        2021-01-23 23:00,  2021-01-23 02:00,  2021-01-23 05:59,  2021-01-24 06:05,
        devient
        Dates calendaire:
        2021-01-23 23:00,  2021-01-24 02:00,  2021-01-24 05:59,  2021-01-24 06:05,
        '''
        if (self.date_calendaire):
            print(self.get_info()+ 'déjà en date Calendaire\n')
        else:
            self.dataset['Date_Fab_complet']=self.dataset['Date_Fab_complet'].apply(lambda row:self._ajoute_un_jour(row, heureEquipeA))
            self.dataset['Date_Fab_complet']=self.dataset['Date_Fab_complet'].astype('datetime64')
            self.date_calendaire = True
            self.dataset.sort_values('Date_Fab_complet', inplace=True)
            self.dataset['Date_Fab']=self.dataset['Date_Fab_complet'].dt.date
            self.dataset['Date_Fab']=self.dataset['Date_Fab'].astype('datetime64')

    def passage_date_Michelin(self, heureEquipeA = 6):
        '''
        passe en heure Michelin depuis une heure calendaire
        seulement si date_calendaire == True

        pour info: la journée Michelin est incrémentée non pas à minuit mais en debut d'équipe A
        Dates calendaire:
        2021-01-23 23:00,  2021-01-24 02:00,  2021-01-24 05:59,  2021-01-24 06:05,
        devient
        Dates Michelin:
        2021-01-23 23:00,  2021-01-23 02:00,  2021-01-23 05:59,  2021-01-24 06:05,
        '''
        if (not self.date_calendaire):
            print(self.get_info()+ 'déjà en date Michelin\n')
        else:
            self.dataset['Date_Fab_complet']=self.dataset['Date_Fab_complet'].apply(lambda row:self._retire_un_jour(row, heureEquipeA))
            self.dataset['Date_Fab_complet']=self.dataset['Date_Fab_complet'].astype('datetime64')
            self.date_calendaire = False
            self.dataset.sort_values('Date_Fab_complet', inplace=True)
            self.dataset['Date_Fab']=self.dataset['Date_Fab_complet'].dt.date
            self.dataset['Date_Fab']=self.dataset['Date_Fab'].astype('datetime64')


    def _ajoute_un_jour(self, date, heureEquipeA):
        '''
        fonction technique (pas appelable directement)
        '''
        heure = date.hour
        if (heure < heureEquipeA):
            return date+np.timedelta64(24, 'h')
        return date

    def _retire_un_jour(self, date, heureEquipeA):
        '''
        fonction technique (pas appelable directement)
        '''
        heure = date.hour
        if (heure < heureEquipeA):
            return date-np.timedelta64(24, 'h')
        return date

    def supprime_doublons(self):
        '''si 2 lignes ont la meme Date_Fab_complet+Num_Tombee,
        on ne garde que la dernière mesure (devrait correspondre à CE)
        (en rediscuter avec Fred)
        '''
        self.dataset.sort_values(['Date_Mes'], inplace=True)
        self.dataset.drop_duplicates(subset=['Date_Fab_complet', 'Num_Tombee'], keep='last', inplace=True)
        self.name = self.name+' sans doublon'
        self.description = self.description + '\n sans doublon'
        self.dataset.sort_values(['Date_Fab_complet'], inplace=True)

    def extraire_periode(self, date_debut, date_fin):
        '''
        retourne un objet STAM
        en ne gardant le contenu du dataset obéissant à date_debut<= Date_Fab <= date_fin

        les dates peuvent être à structure variable: '2021' (année), '2021-01' (mois), '2021-05-23' (jour)
        '''
        sous_dataset=self.dataset.copy()[(self.dataset.Date_Fab >= pd.to_datetime(date_debut))
                                                     & (self.dataset.Date_Fab <= pd.to_datetime(date_fin))]
        nouveauSTAM = STAM(sous_dataset, self.name, self.description+f' filtré entre {date_debut} et {date_fin}.', date_calendaire=self.date_calendaire)
        return nouveauSTAM


    def plot(self, date_debut=None, date_fin=None):
        '''affichage interactif des num_tombee en fonction de la date de fab complet
        en precisant date_debut et date_fin, on vient resserrer la fenetre de visualisation
        les dates peuvent être à structure variable: '2021' (année), '2021-01' (mois), '2021-05-23' (jour)

        il y a 2 courbes, en vert les tests nonCE, en rouge les tests CE
        si on clique dans la legende on peut venir n'afficher que la courbe de son choix
        '''
        mergeStam_copy = self.dataset.copy()
        if (date_debut==None):
            date_debut=mergeStam_copy.Date_Fab_complet.min()
        if (date_fin==None):
            date_fin=mergeStam_copy.Date_Fab_complet.max()

        # quand mergeStam_copy['CE'] est de type object, on est sur un STAM merge (avec des entrées 'CE' et nan)
        # quand mergeStam_copy['CE'] est de type int64, on est sur un STAM clean (avec des entrées 1 et 0)
        # on passe tout dans le style clean

        if (mergeStam_copy['CE'].dtypes == 'object'):
            mergeStam_copy['CE'] = mergeStam_copy['CE'].str.strip()
            mergeStam_copy['CE'].fillna(0,inplace=True)
            mergeStam_copy['CE'].replace('CE', 1, inplace=True)
            mergeStam_copy['CE'] = mergeStam_copy['CE'].astype('int64')

        output_notebook()
        source_stam = ColumnDataSource(mergeStam_copy[(mergeStam_copy.Date_Fab_complet >= pd.to_datetime(date_debut))
                                                     & (mergeStam_copy.Date_Fab_complet <= pd.to_datetime(date_fin))])
        source_stam_CE = ColumnDataSource(mergeStam_copy[(mergeStam_copy.Date_Fab_complet >= pd.to_datetime(date_debut))
                                                     & (mergeStam_copy.Date_Fab_complet <= pd.to_datetime(date_fin))
                                                     & (mergeStam_copy.CE == 1)   ])
        source_stam_noCE = ColumnDataSource(mergeStam_copy[(mergeStam_copy.Date_Fab_complet >= pd.to_datetime(date_debut))
                                                     & (mergeStam_copy.Date_Fab_complet <= pd.to_datetime(date_fin))
                                                     & (mergeStam_copy.CE == 0)   ])


        TOOLS = "xpan,xwheel_zoom,box_zoom,crosshair, reset,save"
        p = figure(x_axis_type='datetime', active_scroll='xwheel_zoom', tools=TOOLS,plot_width=900, plot_height=500)

        p.line(x='Date_Fab_complet', y='Num_Tombee', source=source_stam)

        noce = p.circle(x='Date_Fab_complet', y='Num_Tombee', size=3, line_color="green",
                 fill_color="white", line_width=1, source=source_stam_noCE, legend_label='pas de CE')
        ce = p.circle(x='Date_Fab_complet', y='Num_Tombee', size=3, line_color="red",
                 fill_color="white", line_width=1, source=source_stam_CE, legend_label='avec CE')

        #le mode vline c'est la barre verticale qui appelle la liste des points à cette date
        #le mode mouse est plus ciblé et plus performant
        hover = HoverTool(renderers=[ce, noce],tooltips=[('Date tombée','@Date_Fab_complet{%Y-%m-%d %H:%M:%S}'),
                                                         ('Date mesure','@Date_Mes{%Y-%m-%d %H:%M:%S}'),
                                                         ('Num tombée', '@Num_Tombee'), ('CE', '@CE')],
                      formatters={'@Date_Fab_complet':'datetime', '@Date_Mes':'datetime'}, mode='mouse')
        p.add_tools(hover)
        p.title.text = "Num_tombee en fonction de la date"
        p.legend.location = "top_left"
        p.legend.click_policy="hide"
        show(p)


import datetime
import time

def printDateRangeFromWeek(p_year,p_week):
    '''à partir d'une année et du numero de semaine (ex: 2019, 2)
    affiche les dates du lundi au dimanche.

    Examples
    --------
    >>> printDateRangeFromWeek(2019, 2)
    (2019-2) du 2019-01-07 au 2019-01-13
    (datetime.date(2019, 1, 7), datetime.date(2019, 1, 13))

    Returns
    -------
    tuple de string au format %Y-%m-%d
        les 2 dates entourant cette semaine
    '''

#     firstdayofweek = datetime.datetime.strptime(f'{p_year}-W{int(p_week )- 1}-1', "%Y-W%W-%w").date()
    firstdayofweek = datetime.date.fromisocalendar(p_year, p_week, 1)
    lastdayofweek = firstdayofweek + datetime.timedelta(days=6.9)
    print(f' ({p_year}-{p_week}) du {firstdayofweek} au {lastdayofweek}')
    return firstdayofweek.strftime("%Y-%m-%d"), lastdayofweek.strftime("%Y-%m-%d")

Functions

def printDateRangeFromWeek(p_year, p_week)

à partir d'une année et du numero de semaine (ex: 2019, 2) affiche les dates du lundi au dimanche.

Examples

>>> printDateRangeFromWeek(2019, 2)
(2019-2) du 2019-01-07 au 2019-01-13
(datetime.date(2019, 1, 7), datetime.date(2019, 1, 13))

Returns

tuple de string au format %Y-%m-%d
les 2 dates entourant cette semaine
Expand source code
def printDateRangeFromWeek(p_year,p_week):
    '''à partir d'une année et du numero de semaine (ex: 2019, 2)
    affiche les dates du lundi au dimanche.

    Examples
    --------
    >>> printDateRangeFromWeek(2019, 2)
    (2019-2) du 2019-01-07 au 2019-01-13
    (datetime.date(2019, 1, 7), datetime.date(2019, 1, 13))

    Returns
    -------
    tuple de string au format %Y-%m-%d
        les 2 dates entourant cette semaine
    '''

#     firstdayofweek = datetime.datetime.strptime(f'{p_year}-W{int(p_week )- 1}-1', "%Y-W%W-%w").date()
    firstdayofweek = datetime.date.fromisocalendar(p_year, p_week, 1)
    lastdayofweek = firstdayofweek + datetime.timedelta(days=6.9)
    print(f' ({p_year}-{p_week}) du {firstdayofweek} au {lastdayofweek}')
    return firstdayofweek.strftime("%Y-%m-%d"), lastdayofweek.strftime("%Y-%m-%d")

Classes

class DateFab_NumTombee_Dataset (dataset, name, description='')

Pour stocker les datasets contenant les clés Date_Fab et Num_Tombee

les attributs: - dataset : une copie du dataframe, on supprime les vrais doublons (2 lignes strictement identiques) - name : le nom (abrégé) du dataframe - description : une description en quelques mots

Expand source code
class DateFab_NumTombee_Dataset:
    '''Pour stocker les datasets contenant les clés Date_Fab et Num_Tombee'''
    def __init__(self, dataset, name, description=''):
        '''
        les attributs:
        - dataset : une copie du dataframe, on supprime les vrais doublons (2 lignes strictement identiques)
        - name : le nom (abrégé) du dataframe
        - description : une description en quelques mots
        '''
        self.dataset = dataset.copy()
        self.name = name
        self.description = description
        # on supprime les lignes dupliquées: 2 lignes strictement identiques
        self.dataset.drop_duplicates(inplace=True)

    def get_info(self):
        '''retourne le nom, la description du dataset'''
        return f"\n Dataset {self.name} [{self.description}]\n"

    def get_shape(self):
        '''retourne le nombre de lignes et colonnes du dataset'''
        return f" - shape : ({self.dataset.shape})\n"

    def get_dates(self):
        '''retourne l'amplitude temporelle de Date_Fab du dataset'''
        return f" - amplitude temporelle : ({self.dataset.Date_Fab.min()} - {self.dataset.Date_Fab.max()})\n"

    def __repr__(self):
        '''retourne get_info quand évalué directement'''
        return self.get_info()

    def __str__(self):
        '''retourne get_info, get_shape, get_dates dans un print(<DateFab_NumTombee_Dataset>)'''
        return self.get_info()+self.get_shape()+self.get_dates()+'\n'

    def get_duplicates(self, keep=False):
        '''retourne les lignes du dataset qui contiennent des doublons sur la base de la clé
        Date_Fab, Num_Tombee
        keep{‘first’, ‘last’, False}, default ‘False’
            Determines which duplicates (if any) to mark.
            first : Mark duplicates as True except for the first occurrence.
            last : Mark duplicates as True except for the last occurrence.
            False : Mark all duplicates as True.
        '''
        return self.dataset.loc[self.dataset.duplicated(subset=['Num_Tombee', 'Date_Fab'], keep=keep)]

    def _create_tempo_df(self, dataset_copy):
        '''
        fonction technique (pas à appeler directement)
        à partir d'un dataset qui contient
        les colonnes date_week, date_year
        crée un dataframe dense de 0 de la 1ere semaine à la derniere
        (c'est uniquement pour completer les density plots : plot_density_per_week, plot_density_per_week_bokeh, comparaison_plot_density)
        '''
        if (dataset_copy.shape[0]==0):
            return pd.DataFrame()
        debut_annee=dataset_copy['date_year'].min()
        fin_annee=dataset_copy['date_year'].max()
        debut_semaine=dataset_copy.loc[dataset_copy['date_year'] == debut_annee]['date_week'].min()
        fin_semaine=dataset_copy.loc[dataset_copy['date_year'] == fin_annee]['date_week'].max()
        liste_tempo = []
        for annee in range(debut_annee, fin_annee+1):
            deb_sem = 1
            fin_sem = 52
            if (annee == debut_annee):
                deb_sem = debut_semaine
            if (annee == fin_annee):
                fin_sem = fin_semaine
            for sem in range(deb_sem, fin_sem+1):
                liste_tempo.append([annee, sem, 0, 0])
        liste_tempo_df = pd.DataFrame(liste_tempo, columns =['date_year', 'date_week', 'Unique', 'Doublons']).set_index(['date_year', 'date_week'])
        return liste_tempo_df


    def plot_density_per_week_matplotlib(self, without_duplicate=False):
        '''affiche le nombre d'observations par semaine
        si without_duplicate=True, on drop les doublons sur le critere ['Num_Tombee', 'Date_Fab']
        sinon on les affiche en rouge (par défaut)
        '''
        dataset_copy = self.dataset.copy()
        if (without_duplicate):
            dataset_copy.drop_duplicates(subset=['Date_Fab', 'Num_Tombee'], inplace=True)
        # add columns for week and year of the date
        dataset_copy['date_week'] = dataset_copy['Date_Fab'].apply(lambda x: x.isocalendar()[1])
        dataset_copy['date_year'] = dataset_copy['Date_Fab'].apply(lambda x: x.isocalendar()[0])

        dataset_unique = dataset_copy.drop_duplicates(subset=['Date_Fab', 'Num_Tombee'])
        dataset_doublon = dataset_copy.loc[dataset_copy.index.difference(dataset_unique.index)]
        groupage_unique = dataset_unique.groupby([dataset_unique['date_year'],dataset_unique['date_week']])['Num_Tombee'].count()
        groupage_doublon = dataset_doublon.groupby([dataset_doublon['date_year'],dataset_doublon['date_week']])['Num_Tombee'].count()

        graph_rft = pd.concat([groupage_unique, groupage_doublon], axis=1)
        graph_rft.columns=['Unique', 'Doublons']
        graph_rft=graph_rft[['Unique', 'Doublons']]

        graph_rft=graph_rft.reindex(self._create_tempo_df(dataset_copy).index)

        colors = ["green" , "red"]
        barWidth = 0.85
        graph_rft.plot.bar(stacked=True, color=colors, figsize=(17,7),width=barWidth)
        plt.show()

    def plot_density_per_week(self, without_duplicate=False):
        '''affiche le nombre d'observations par semaine
        si without_duplicate=True, on drop les doublons sur le critere ['Num_Tombee', 'Date_Fab']
        sinon on les affiche en rouge (par défaut)
        '''
        dataset_copy = self.dataset.copy()
        if (without_duplicate):
            dataset_copy.drop_duplicates(subset=['Date_Fab', 'Num_Tombee'], inplace=True)
        # add columns for week and year of the date
        dataset_copy['date_week'] = dataset_copy['Date_Fab'].apply(lambda x: x.isocalendar()[1])
        dataset_copy['date_year'] = dataset_copy['Date_Fab'].apply(lambda x: x.isocalendar()[0])

        dataset_unique = dataset_copy.drop_duplicates(subset=['Date_Fab', 'Num_Tombee'])
        dataset_doublon = dataset_copy.loc[dataset_copy.index.difference(dataset_unique.index)]
        groupage_unique = dataset_unique.groupby([dataset_unique['date_year'],dataset_unique['date_week']])['Num_Tombee'].count()
        groupage_doublon = dataset_doublon.groupby([dataset_doublon['date_year'],dataset_doublon['date_week']])['Num_Tombee'].count()

        graph_rft = pd.concat([groupage_unique, groupage_doublon], axis=1)
        graph_rft.columns=['Unique', 'Doublons']
        graph_rft=graph_rft[['Unique', 'Doublons']]

        graph_rft=graph_rft.reindex(self._create_tempo_df(dataset_copy).index)
        graph_rft=graph_rft.reset_index(level=[0,1])
        graph_rft['index']=graph_rft['date_year'].apply(str)+'-'+graph_rft['date_week'].apply(str)
        graph_rft.fillna(0, inplace=True)
        graph_rft['total']=graph_rft['Unique']+graph_rft['Doublons']
    #     graph_rft['index']=graph_rft['index'].astype('int64')
        graph_rft.set_index(['index'], inplace=True)

        graph_rft.drop(['date_year', 'date_week'], axis=1, inplace=True)

    #     return graph_rft

        colors = ["green" , "red"]
        barWidth = 0.7
    #         graph_rft.plot.bar(stacked=True, color=colors, figsize=(17,7),width=barWidth)
    #         plt.show()

        output_notebook()
        TOOLS = "xpan,xwheel_zoom,crosshair, reset,save"

        p = figure(x_range=list(graph_rft.index), title="Density plot "+self.name,
                   tools=TOOLS, active_scroll='xwheel_zoom', plot_width=900, plot_height=500)
        v = p.vbar_stack(['Unique', 'Doublons'], x='index', width=barWidth, color=colors,
                     source=graph_rft, line_color=None)

        tooltips = [
            ("Total ", "@total"),
            ("Unique ", "@Unique"),
            ("Doublons ", "@Doublons"),
            ('# de semaine ', "@index")
        ]

        hover = HoverTool(tooltips=tooltips)
        p.add_tools(hover)
    #     item1 = LegendItem({'label':'Unique', 'renderers':[p.renderers[0]]});
    #     item2 = LegendItem({'label':'Doublons', 'renderers':[p.renderers[1]]});
    #     legend = Legend(items=[item1, item2])
    #     p.add_layout(legend)

        legend=Legend(items=[
            ("Unique",   [v[0]]),
            ("Doublons",   [v[1]])
        ], location=(0, -30))
        p.add_layout(legend)

        p.legend.orientation = "horizontal"
        p.legend.location = "top_center"
        p.legend.click_policy="hide"

        p.xaxis.major_label_orientation = 3*pi/8
        p.xaxis.axis_label_text_font_size = "5pt"
        p.xaxis.major_label_text_font_size = "5pt"
        p.xaxis.axis_label_text_font = "times"
        p.xaxis.axis_label_text_color = "black"

        show(p)

    def extraire_periode(self, date_debut, date_fin):
        '''
        retourne un objet DateFab_NumTombee_Dataset
        en ne gardant le contenu du dataset obéissant à date_debut<= Date_Fab <= date_fin

        les dates peuvent être à structure variable: '2021' (année), '2021-01' (mois), '2021-05-23' (jour)
        '''
        sous_dataset=self.dataset.copy()[(self.dataset.Date_Fab >= pd.to_datetime(date_debut))
                                                     & (self.dataset.Date_Fab <= pd.to_datetime(date_fin))]
        nouveauDateFab_NumTombee_Dataset = DateFab_NumTombee_Dataset(sous_dataset, self.name, self.description+f' filtré entre {date_debut} et {date_fin}.')
        return nouveauDateFab_NumTombee_Dataset


    def comparaison(self, autreDateFab_NumTombee_Dataset):
        '''retourne 3 objets DateFab_NumTombee_Dataset dont les datasets sont:
        - dataset_commun - c'est l'intersection des index (Date_Fab, Num_Tombee) de self et autreDateFab_NumTombee_Dataset
        - dataset_difference_gauche - c'est la difference des index (Date_Fab, Num_Tombee) de self et
                                        autreDateFab_NumTombee_Dataset en partant de self
        - dataset_difference_droite - c'est la difference des index (Date_Fab, Num_Tombee) de self et
                                        autreDateFab_NumTombee_Dataset en partant de autreDateFab_NumTombee_Dataset
        '''
        index_commun = self.dataset.set_index(['Date_Fab', 'Num_Tombee']).index.intersection(autreDateFab_NumTombee_Dataset.dataset.set_index(['Date_Fab', 'Num_Tombee']).index)
        index_gauche = self.dataset.set_index(['Date_Fab', 'Num_Tombee']).index.difference(autreDateFab_NumTombee_Dataset.dataset.set_index(['Date_Fab', 'Num_Tombee']).index)
        index_droite = autreDateFab_NumTombee_Dataset.dataset.set_index(['Date_Fab', 'Num_Tombee']).index.difference(self.dataset.set_index(['Date_Fab', 'Num_Tombee']).index)

        if (len(index_commun)==0):
            dataset_commun=pd.DataFrame(columns=self.dataset.columns)
        else:
            dataset_commun = self.dataset.set_index(['Date_Fab', 'Num_Tombee']).loc[index_commun].reset_index()

        if (len(index_gauche)==0):
            dataset_difference_gauche = pd.DataFrame(columns=self.dataset.columns)
        else:
            dataset_difference_gauche = self.dataset.set_index(['Date_Fab', 'Num_Tombee']).loc[index_gauche].reset_index()

        if (len(index_droite)==0):
            dataset_difference_droite = pd.DataFrame(columns=autreDateFab_NumTombee_Dataset.dataset.columns)
        else:
            dataset_difference_droite = autreDateFab_NumTombee_Dataset.dataset.set_index(['Date_Fab', 'Num_Tombee']).loc[index_droite].reset_index()

        dataset_commun_obj = DateFab_NumTombee_Dataset(dataset_commun, self.name+' inter '+autreDateFab_NumTombee_Dataset.name, 'Intersection des 2 datasets : \n'+self.description+'\n'+autreDateFab_NumTombee_Dataset.description)
        dataset_difference_gauche_obj = DateFab_NumTombee_Dataset(dataset_difference_gauche, self.name+' diff '+autreDateFab_NumTombee_Dataset.name, 'Différence des 2 datasets : \n'+self.description+'\n'+autreDateFab_NumTombee_Dataset.description)
        dataset_difference_droite_obj = DateFab_NumTombee_Dataset(dataset_difference_droite, autreDateFab_NumTombee_Dataset.name+' diff '+self.name, 'Différence des 2 datasets : \n'+autreDateFab_NumTombee_Dataset.description+'\n'+self.description)
        print(f'couverture commune : {100*dataset_commun_obj.dataset.shape[0]/(dataset_commun_obj.dataset.shape[0]+dataset_difference_gauche_obj.dataset.shape[0]+dataset_difference_droite_obj.dataset.shape[0]):0.02f} %')
        return dataset_commun_obj, dataset_difference_gauche_obj, dataset_difference_droite_obj


    def comparaison_plot_density_matplotlib(self, autreDateFab_NumTombee_Dataset):
        '''affiche le nombre d'observations par semaine
        3 informations :
        - en bleu : les données uniquement dans self
        - en vert: les données (index) communes aux 2 datasets
        - en rouge : les données uniquement dans autreDateFab_NumTombee_Dataset
        '''
        obj_commun, obj_gauche, obj_droite = self.comparaison(autreDateFab_NumTombee_Dataset)
        for dataset in [obj_commun.dataset, obj_gauche.dataset, obj_droite.dataset]:
            # add columns for week and year of the date
            dataset['date_week'] = dataset['Date_Fab'].apply(lambda x: x.isocalendar()[1])
            dataset['date_year'] = dataset['Date_Fab'].apply(lambda x: x.isocalendar()[0])

        groupage_commun = obj_commun.dataset.groupby([obj_commun.dataset['date_year'],obj_commun.dataset['date_week']])['Num_Tombee'].count()
        groupage_gauche = obj_gauche.dataset.groupby([obj_gauche.dataset['date_year'],obj_gauche.dataset['date_week']])['Num_Tombee'].count()
        groupage_droite = obj_droite.dataset.groupby([obj_droite.dataset['date_year'],obj_droite.dataset['date_week']])['Num_Tombee'].count()


        graph_rft = pd.concat([groupage_gauche, groupage_commun, groupage_droite], axis=1)
        graph_rft.columns=[obj_gauche.name, obj_commun.name, obj_droite.name]
        graph_rft=graph_rft[[obj_gauche.name, obj_commun.name, obj_droite.name]]

        graph_rft=graph_rft.reindex(self._create_tempo_df(obj_commun.dataset).index.union(self._create_tempo_df(obj_gauche.dataset).index.union(self._create_tempo_df(obj_droite.dataset).index)))

        colors = ["blue", "green" , "red"]
        barWidth = 0.85
        graph_rft.plot.bar(stacked=True, color=colors, figsize=(17,7),width=barWidth)
        plt.show()

    def comparaison_plot_density(self, autreDateFab_NumTombee_Dataset):
        '''affiche le nombre d'observations par semaine
        3 informations :
        - en bleu : les données uniquement dans self
        - en vert: les données (index) communes aux 2 datasets
        - en rouge : les données uniquement dans autreDateFab_NumTombee_Dataset
        '''
        obj_commun, obj_gauche, obj_droite = self.comparaison(autreDateFab_NumTombee_Dataset)

        for dataset in [obj_commun.dataset, obj_gauche.dataset, obj_droite.dataset]:
            # add columns for week and year of the date
            if (dataset.empty):
                dataset['date_week'] = dataset['Date_Fab']
                dataset['date_year'] = dataset['Date_Fab']
            else:
                dataset['date_week'] = dataset['Date_Fab'].apply(lambda x: x.isocalendar()[1])
                dataset['date_year'] = dataset['Date_Fab'].apply(lambda x: x.isocalendar()[0])

        groupage_commun = obj_commun.dataset.groupby([obj_commun.dataset['date_year'],obj_commun.dataset['date_week']])['Num_Tombee'].count()
        groupage_gauche = obj_gauche.dataset.groupby([obj_gauche.dataset['date_year'],obj_gauche.dataset['date_week']])['Num_Tombee'].count()
        groupage_droite = obj_droite.dataset.groupby([obj_droite.dataset['date_year'],obj_droite.dataset['date_week']])['Num_Tombee'].count()


        graph_rft = pd.concat([groupage_gauche, groupage_commun, groupage_droite], axis=1)
        graph_rft.columns=[obj_gauche.name, obj_commun.name, obj_droite.name]
        graph_rft=graph_rft[[obj_gauche.name, obj_commun.name, obj_droite.name]]

        graph_rft=graph_rft.reindex(self._create_tempo_df(obj_commun.dataset).index.union(self._create_tempo_df(obj_gauche.dataset).index.union(self._create_tempo_df(obj_droite.dataset).index)))

        colors = ["blue", "green" , "red"]
        barWidth = 0.85
    #     graph_rft.plot.bar(stacked=True, color=colors, figsize=(17,7),width=barWidth)
    #     plt.show()
        graph_rft=graph_rft.reset_index(level=[0,1])
        graph_rft['index']=graph_rft['date_year'].apply(str)+'-'+graph_rft['date_week'].apply(str)
        graph_rft.fillna(0, inplace=True)

        graph_rft['total']=graph_rft[graph_rft.columns[2]]+graph_rft[graph_rft.columns[3]]+graph_rft[graph_rft.columns[4]]
    #     graph_rft['index']=graph_rft['index'].astype('int64')
        graph_rft.set_index(['index'], inplace=True)

        graph_rft.drop(['date_year', 'date_week'], axis=1, inplace=True)
    #     return graph_rft

    #     return graph_rft

    #     colors = ["green" , "red"]
        barWidth = 0.7
    #         graph_rft.plot.bar(stacked=True, color=colors, figsize=(17,7),width=barWidth)
    #         plt.show()

        graph_rft.columns=['gauche', 'commun', 'droite', 'total']

        output_notebook()
        TOOLS = "xpan,xwheel_zoom,crosshair, reset,save"

        p = figure(x_range=list(graph_rft.index), title="Density plot "+self.name+" vs "+autreDateFab_NumTombee_Dataset.name,
                   tools=TOOLS, active_scroll='xwheel_zoom', plot_width=900, plot_height=500)
        v = p.vbar_stack(['gauche', 'commun', 'droite'], x='index', width=barWidth, color=colors,
                     source=graph_rft, line_color=None)



        tooltips = [
            ("Total ", "@total"),
            (obj_gauche.name, "@gauche"),
            (obj_commun.name, "@commun"),
            (obj_droite.name, "@droite"),
            ('# de semaine ', "@index")
        ]

        hover = HoverTool(tooltips=tooltips)
        p.add_tools(hover)
    #     item1 = LegendItem({'label':'Unique', 'renderers':[p.renderers[0]]});
    #     item2 = LegendItem({'label':'Doublons', 'renderers':[p.renderers[1]]});
    #     legend = Legend(items=[item1, item2])
    #     p.add_layout(legend)

        legend=Legend(items=[
            (obj_gauche.name,   [v[0]]),
            (obj_commun.name,   [v[1]]),
            (obj_droite.name,   [v[2]])
        ], location=(0, -30))
        p.add_layout(legend)

        p.legend.orientation = "horizontal"
        p.legend.location = "top_center"
        p.legend.click_policy="hide"

        p.xaxis.major_label_orientation = 3*pi/8
        p.xaxis.axis_label_text_font_size = "5pt"
        p.xaxis.major_label_text_font_size = "5pt"
        p.xaxis.axis_label_text_font = "times"
        p.xaxis.axis_label_text_color = "black"

        show(p)

    def plot(self, date_debut=None, date_fin=None):
        '''affichage interactif des num_tombee en fonction de la date de fab
        en precisant date_debut et date_fin, on vient resserrer la fenetre de visualisation
        les dates peuvent être à structure variable: '2021' (année), '2021-01' (mois), '2021-05-23' (jour)
        '''
        dataset_copy = self.dataset.copy()
        if (date_debut==None):
            date_debut=dataset_copy.Date_Fab.min()
        if (date_fin==None):
            date_fin=dataset_copy.Date_Fab.max()

        output_notebook()
        source_donnees = ColumnDataSource(dataset_copy[(dataset_copy.Date_Fab >= pd.to_datetime(date_debut))
                                                     & (dataset_copy.Date_Fab <= pd.to_datetime(date_fin))])
        TOOLS = "xpan,xwheel_zoom,box_zoom,crosshair, reset,save"
        p = figure(x_axis_type='datetime', active_scroll='xwheel_zoom', tools=TOOLS,plot_width=900, plot_height=500)

        p.line(x='Date_Fab', y='Num_Tombee', source=source_donnees)

        p.circle(x='Date_Fab', y='Num_Tombee', size=3, line_color="green",
                 fill_color="white", line_width=1, source=source_donnees, legend_label=self.name)

        hover = HoverTool(tooltips=[('Date tombée','@Date_Fab{%Y-%m-%d %H:%M:%S}'),
                                ('Num tombée', '@Num_Tombee')],
                      formatters={'@Date_Fab':'datetime'})
        p.add_tools(hover)
        p.title.text = "Num_tombee en fonction de la date"
        show(p)

    def comparaison_plot(self, autreDateFab_NumTombee_Dataset, date_debut=None, date_fin=None):
        '''affichage interactif des num_tombee en fonction de la date de fab
        pour les 3 datasets retournés par comparaison
        '''
        dataset_copy = self.dataset.copy()
        if (date_debut==None):
            date_debut=dataset_copy.Date_Fab.min()
        if (date_fin==None):
            date_fin=dataset_copy.Date_Fab.max()

        dataset_commun_obj, dataset_difference_gauche_obj, dataset_difference_droite_obj = self.extraire_periode(date_debut, date_fin).comparaison(autreDateFab_NumTombee_Dataset.extraire_periode(date_debut, date_fin))

        output_notebook()
        source_donnees_commun = ColumnDataSource(dataset_commun_obj.dataset)
        source_donnees_droite = ColumnDataSource(dataset_difference_droite_obj.dataset)
        source_donnees_gauche = ColumnDataSource(dataset_difference_gauche_obj.dataset)

        TOOLS = "xpan,xwheel_zoom,box_zoom,crosshair, reset,save"
        p = figure(x_axis_type='datetime', active_scroll='xwheel_zoom', tools=TOOLS,plot_width=900, plot_height=500)

#         p.line(x='Date_Fab', y='Num_Tombee', source=source_donnees)

        p.circle(x='Date_Fab', y='Num_Tombee', size=3, line_color="green",
                 fill_color="white", line_width=1, source=source_donnees_commun, legend_label=dataset_commun_obj.name)
        p.circle(x='Date_Fab', y='Num_Tombee', size=3, line_color="red",
                 fill_color="white", line_width=1, source=source_donnees_droite, legend_label=dataset_difference_droite_obj.name)
        p.circle(x='Date_Fab', y='Num_Tombee', size=3, line_color="blue",
                 fill_color="white", line_width=1, source=source_donnees_gauche, legend_label=dataset_difference_gauche_obj.name)

        hover = HoverTool(tooltips=[('Date tombée','@Date_Fab{%Y-%m-%d %H:%M:%S}'),
                                ('Num tombée', '@Num_Tombee')],
                      formatters={'@Date_Fab':'datetime'})
        p.add_tools(hover)
        p.title.text = "Num_tombee en fonction de la date"
        p.legend.click_policy="hide"
        show(p)

Subclasses

Methods

def comparaison(self, autreDateFab_NumTombee_Dataset)

retourne 3 objets DateFab_NumTombee_Dataset dont les datasets sont: - dataset_commun - c'est l'intersection des index (Date_Fab, Num_Tombee) de self et autreDateFab_NumTombee_Dataset - dataset_difference_gauche - c'est la difference des index (Date_Fab, Num_Tombee) de self et autreDateFab_NumTombee_Dataset en partant de self - dataset_difference_droite - c'est la difference des index (Date_Fab, Num_Tombee) de self et autreDateFab_NumTombee_Dataset en partant de autreDateFab_NumTombee_Dataset

Expand source code
def comparaison(self, autreDateFab_NumTombee_Dataset):
    '''retourne 3 objets DateFab_NumTombee_Dataset dont les datasets sont:
    - dataset_commun - c'est l'intersection des index (Date_Fab, Num_Tombee) de self et autreDateFab_NumTombee_Dataset
    - dataset_difference_gauche - c'est la difference des index (Date_Fab, Num_Tombee) de self et
                                    autreDateFab_NumTombee_Dataset en partant de self
    - dataset_difference_droite - c'est la difference des index (Date_Fab, Num_Tombee) de self et
                                    autreDateFab_NumTombee_Dataset en partant de autreDateFab_NumTombee_Dataset
    '''
    index_commun = self.dataset.set_index(['Date_Fab', 'Num_Tombee']).index.intersection(autreDateFab_NumTombee_Dataset.dataset.set_index(['Date_Fab', 'Num_Tombee']).index)
    index_gauche = self.dataset.set_index(['Date_Fab', 'Num_Tombee']).index.difference(autreDateFab_NumTombee_Dataset.dataset.set_index(['Date_Fab', 'Num_Tombee']).index)
    index_droite = autreDateFab_NumTombee_Dataset.dataset.set_index(['Date_Fab', 'Num_Tombee']).index.difference(self.dataset.set_index(['Date_Fab', 'Num_Tombee']).index)

    if (len(index_commun)==0):
        dataset_commun=pd.DataFrame(columns=self.dataset.columns)
    else:
        dataset_commun = self.dataset.set_index(['Date_Fab', 'Num_Tombee']).loc[index_commun].reset_index()

    if (len(index_gauche)==0):
        dataset_difference_gauche = pd.DataFrame(columns=self.dataset.columns)
    else:
        dataset_difference_gauche = self.dataset.set_index(['Date_Fab', 'Num_Tombee']).loc[index_gauche].reset_index()

    if (len(index_droite)==0):
        dataset_difference_droite = pd.DataFrame(columns=autreDateFab_NumTombee_Dataset.dataset.columns)
    else:
        dataset_difference_droite = autreDateFab_NumTombee_Dataset.dataset.set_index(['Date_Fab', 'Num_Tombee']).loc[index_droite].reset_index()

    dataset_commun_obj = DateFab_NumTombee_Dataset(dataset_commun, self.name+' inter '+autreDateFab_NumTombee_Dataset.name, 'Intersection des 2 datasets : \n'+self.description+'\n'+autreDateFab_NumTombee_Dataset.description)
    dataset_difference_gauche_obj = DateFab_NumTombee_Dataset(dataset_difference_gauche, self.name+' diff '+autreDateFab_NumTombee_Dataset.name, 'Différence des 2 datasets : \n'+self.description+'\n'+autreDateFab_NumTombee_Dataset.description)
    dataset_difference_droite_obj = DateFab_NumTombee_Dataset(dataset_difference_droite, autreDateFab_NumTombee_Dataset.name+' diff '+self.name, 'Différence des 2 datasets : \n'+autreDateFab_NumTombee_Dataset.description+'\n'+self.description)
    print(f'couverture commune : {100*dataset_commun_obj.dataset.shape[0]/(dataset_commun_obj.dataset.shape[0]+dataset_difference_gauche_obj.dataset.shape[0]+dataset_difference_droite_obj.dataset.shape[0]):0.02f} %')
    return dataset_commun_obj, dataset_difference_gauche_obj, dataset_difference_droite_obj
def comparaison_plot(self, autreDateFab_NumTombee_Dataset, date_debut=None, date_fin=None)

affichage interactif des num_tombee en fonction de la date de fab pour les 3 datasets retournés par comparaison

Expand source code
    def comparaison_plot(self, autreDateFab_NumTombee_Dataset, date_debut=None, date_fin=None):
        '''affichage interactif des num_tombee en fonction de la date de fab
        pour les 3 datasets retournés par comparaison
        '''
        dataset_copy = self.dataset.copy()
        if (date_debut==None):
            date_debut=dataset_copy.Date_Fab.min()
        if (date_fin==None):
            date_fin=dataset_copy.Date_Fab.max()

        dataset_commun_obj, dataset_difference_gauche_obj, dataset_difference_droite_obj = self.extraire_periode(date_debut, date_fin).comparaison(autreDateFab_NumTombee_Dataset.extraire_periode(date_debut, date_fin))

        output_notebook()
        source_donnees_commun = ColumnDataSource(dataset_commun_obj.dataset)
        source_donnees_droite = ColumnDataSource(dataset_difference_droite_obj.dataset)
        source_donnees_gauche = ColumnDataSource(dataset_difference_gauche_obj.dataset)

        TOOLS = "xpan,xwheel_zoom,box_zoom,crosshair, reset,save"
        p = figure(x_axis_type='datetime', active_scroll='xwheel_zoom', tools=TOOLS,plot_width=900, plot_height=500)

#         p.line(x='Date_Fab', y='Num_Tombee', source=source_donnees)

        p.circle(x='Date_Fab', y='Num_Tombee', size=3, line_color="green",
                 fill_color="white", line_width=1, source=source_donnees_commun, legend_label=dataset_commun_obj.name)
        p.circle(x='Date_Fab', y='Num_Tombee', size=3, line_color="red",
                 fill_color="white", line_width=1, source=source_donnees_droite, legend_label=dataset_difference_droite_obj.name)
        p.circle(x='Date_Fab', y='Num_Tombee', size=3, line_color="blue",
                 fill_color="white", line_width=1, source=source_donnees_gauche, legend_label=dataset_difference_gauche_obj.name)

        hover = HoverTool(tooltips=[('Date tombée','@Date_Fab{%Y-%m-%d %H:%M:%S}'),
                                ('Num tombée', '@Num_Tombee')],
                      formatters={'@Date_Fab':'datetime'})
        p.add_tools(hover)
        p.title.text = "Num_tombee en fonction de la date"
        p.legend.click_policy="hide"
        show(p)
def comparaison_plot_density(self, autreDateFab_NumTombee_Dataset)

affiche le nombre d'observations par semaine 3 informations : - en bleu : les données uniquement dans self - en vert: les données (index) communes aux 2 datasets - en rouge : les données uniquement dans autreDateFab_NumTombee_Dataset

Expand source code
def comparaison_plot_density(self, autreDateFab_NumTombee_Dataset):
    '''affiche le nombre d'observations par semaine
    3 informations :
    - en bleu : les données uniquement dans self
    - en vert: les données (index) communes aux 2 datasets
    - en rouge : les données uniquement dans autreDateFab_NumTombee_Dataset
    '''
    obj_commun, obj_gauche, obj_droite = self.comparaison(autreDateFab_NumTombee_Dataset)

    for dataset in [obj_commun.dataset, obj_gauche.dataset, obj_droite.dataset]:
        # add columns for week and year of the date
        if (dataset.empty):
            dataset['date_week'] = dataset['Date_Fab']
            dataset['date_year'] = dataset['Date_Fab']
        else:
            dataset['date_week'] = dataset['Date_Fab'].apply(lambda x: x.isocalendar()[1])
            dataset['date_year'] = dataset['Date_Fab'].apply(lambda x: x.isocalendar()[0])

    groupage_commun = obj_commun.dataset.groupby([obj_commun.dataset['date_year'],obj_commun.dataset['date_week']])['Num_Tombee'].count()
    groupage_gauche = obj_gauche.dataset.groupby([obj_gauche.dataset['date_year'],obj_gauche.dataset['date_week']])['Num_Tombee'].count()
    groupage_droite = obj_droite.dataset.groupby([obj_droite.dataset['date_year'],obj_droite.dataset['date_week']])['Num_Tombee'].count()


    graph_rft = pd.concat([groupage_gauche, groupage_commun, groupage_droite], axis=1)
    graph_rft.columns=[obj_gauche.name, obj_commun.name, obj_droite.name]
    graph_rft=graph_rft[[obj_gauche.name, obj_commun.name, obj_droite.name]]

    graph_rft=graph_rft.reindex(self._create_tempo_df(obj_commun.dataset).index.union(self._create_tempo_df(obj_gauche.dataset).index.union(self._create_tempo_df(obj_droite.dataset).index)))

    colors = ["blue", "green" , "red"]
    barWidth = 0.85
#     graph_rft.plot.bar(stacked=True, color=colors, figsize=(17,7),width=barWidth)
#     plt.show()
    graph_rft=graph_rft.reset_index(level=[0,1])
    graph_rft['index']=graph_rft['date_year'].apply(str)+'-'+graph_rft['date_week'].apply(str)
    graph_rft.fillna(0, inplace=True)

    graph_rft['total']=graph_rft[graph_rft.columns[2]]+graph_rft[graph_rft.columns[3]]+graph_rft[graph_rft.columns[4]]
#     graph_rft['index']=graph_rft['index'].astype('int64')
    graph_rft.set_index(['index'], inplace=True)

    graph_rft.drop(['date_year', 'date_week'], axis=1, inplace=True)
#     return graph_rft

#     return graph_rft

#     colors = ["green" , "red"]
    barWidth = 0.7
#         graph_rft.plot.bar(stacked=True, color=colors, figsize=(17,7),width=barWidth)
#         plt.show()

    graph_rft.columns=['gauche', 'commun', 'droite', 'total']

    output_notebook()
    TOOLS = "xpan,xwheel_zoom,crosshair, reset,save"

    p = figure(x_range=list(graph_rft.index), title="Density plot "+self.name+" vs "+autreDateFab_NumTombee_Dataset.name,
               tools=TOOLS, active_scroll='xwheel_zoom', plot_width=900, plot_height=500)
    v = p.vbar_stack(['gauche', 'commun', 'droite'], x='index', width=barWidth, color=colors,
                 source=graph_rft, line_color=None)



    tooltips = [
        ("Total ", "@total"),
        (obj_gauche.name, "@gauche"),
        (obj_commun.name, "@commun"),
        (obj_droite.name, "@droite"),
        ('# de semaine ', "@index")
    ]

    hover = HoverTool(tooltips=tooltips)
    p.add_tools(hover)
#     item1 = LegendItem({'label':'Unique', 'renderers':[p.renderers[0]]});
#     item2 = LegendItem({'label':'Doublons', 'renderers':[p.renderers[1]]});
#     legend = Legend(items=[item1, item2])
#     p.add_layout(legend)

    legend=Legend(items=[
        (obj_gauche.name,   [v[0]]),
        (obj_commun.name,   [v[1]]),
        (obj_droite.name,   [v[2]])
    ], location=(0, -30))
    p.add_layout(legend)

    p.legend.orientation = "horizontal"
    p.legend.location = "top_center"
    p.legend.click_policy="hide"

    p.xaxis.major_label_orientation = 3*pi/8
    p.xaxis.axis_label_text_font_size = "5pt"
    p.xaxis.major_label_text_font_size = "5pt"
    p.xaxis.axis_label_text_font = "times"
    p.xaxis.axis_label_text_color = "black"

    show(p)
def comparaison_plot_density_matplotlib(self, autreDateFab_NumTombee_Dataset)

affiche le nombre d'observations par semaine 3 informations : - en bleu : les données uniquement dans self - en vert: les données (index) communes aux 2 datasets - en rouge : les données uniquement dans autreDateFab_NumTombee_Dataset

Expand source code
def comparaison_plot_density_matplotlib(self, autreDateFab_NumTombee_Dataset):
    '''affiche le nombre d'observations par semaine
    3 informations :
    - en bleu : les données uniquement dans self
    - en vert: les données (index) communes aux 2 datasets
    - en rouge : les données uniquement dans autreDateFab_NumTombee_Dataset
    '''
    obj_commun, obj_gauche, obj_droite = self.comparaison(autreDateFab_NumTombee_Dataset)
    for dataset in [obj_commun.dataset, obj_gauche.dataset, obj_droite.dataset]:
        # add columns for week and year of the date
        dataset['date_week'] = dataset['Date_Fab'].apply(lambda x: x.isocalendar()[1])
        dataset['date_year'] = dataset['Date_Fab'].apply(lambda x: x.isocalendar()[0])

    groupage_commun = obj_commun.dataset.groupby([obj_commun.dataset['date_year'],obj_commun.dataset['date_week']])['Num_Tombee'].count()
    groupage_gauche = obj_gauche.dataset.groupby([obj_gauche.dataset['date_year'],obj_gauche.dataset['date_week']])['Num_Tombee'].count()
    groupage_droite = obj_droite.dataset.groupby([obj_droite.dataset['date_year'],obj_droite.dataset['date_week']])['Num_Tombee'].count()


    graph_rft = pd.concat([groupage_gauche, groupage_commun, groupage_droite], axis=1)
    graph_rft.columns=[obj_gauche.name, obj_commun.name, obj_droite.name]
    graph_rft=graph_rft[[obj_gauche.name, obj_commun.name, obj_droite.name]]

    graph_rft=graph_rft.reindex(self._create_tempo_df(obj_commun.dataset).index.union(self._create_tempo_df(obj_gauche.dataset).index.union(self._create_tempo_df(obj_droite.dataset).index)))

    colors = ["blue", "green" , "red"]
    barWidth = 0.85
    graph_rft.plot.bar(stacked=True, color=colors, figsize=(17,7),width=barWidth)
    plt.show()
def extraire_periode(self, date_debut, date_fin)

retourne un objet DateFab_NumTombee_Dataset en ne gardant le contenu du dataset obéissant à date_debut<= Date_Fab <= date_fin

les dates peuvent être à structure variable: '2021' (année), '2021-01' (mois), '2021-05-23' (jour)

Expand source code
def extraire_periode(self, date_debut, date_fin):
    '''
    retourne un objet DateFab_NumTombee_Dataset
    en ne gardant le contenu du dataset obéissant à date_debut<= Date_Fab <= date_fin

    les dates peuvent être à structure variable: '2021' (année), '2021-01' (mois), '2021-05-23' (jour)
    '''
    sous_dataset=self.dataset.copy()[(self.dataset.Date_Fab >= pd.to_datetime(date_debut))
                                                 & (self.dataset.Date_Fab <= pd.to_datetime(date_fin))]
    nouveauDateFab_NumTombee_Dataset = DateFab_NumTombee_Dataset(sous_dataset, self.name, self.description+f' filtré entre {date_debut} et {date_fin}.')
    return nouveauDateFab_NumTombee_Dataset
def get_dates(self)

retourne l'amplitude temporelle de Date_Fab du dataset

Expand source code
def get_dates(self):
    '''retourne l'amplitude temporelle de Date_Fab du dataset'''
    return f" - amplitude temporelle : ({self.dataset.Date_Fab.min()} - {self.dataset.Date_Fab.max()})\n"
def get_duplicates(self, keep=False)

retourne les lignes du dataset qui contiennent des doublons sur la base de la clé Date_Fab, Num_Tombee keep{‘first’, ‘last’, False}, default ‘False’ Determines which duplicates (if any) to mark. first : Mark duplicates as True except for the first occurrence. last : Mark duplicates as True except for the last occurrence. False : Mark all duplicates as True.

Expand source code
def get_duplicates(self, keep=False):
    '''retourne les lignes du dataset qui contiennent des doublons sur la base de la clé
    Date_Fab, Num_Tombee
    keep{‘first’, ‘last’, False}, default ‘False’
        Determines which duplicates (if any) to mark.
        first : Mark duplicates as True except for the first occurrence.
        last : Mark duplicates as True except for the last occurrence.
        False : Mark all duplicates as True.
    '''
    return self.dataset.loc[self.dataset.duplicated(subset=['Num_Tombee', 'Date_Fab'], keep=keep)]
def get_info(self)

retourne le nom, la description du dataset

Expand source code
def get_info(self):
    '''retourne le nom, la description du dataset'''
    return f"\n Dataset {self.name} [{self.description}]\n"
def get_shape(self)

retourne le nombre de lignes et colonnes du dataset

Expand source code
def get_shape(self):
    '''retourne le nombre de lignes et colonnes du dataset'''
    return f" - shape : ({self.dataset.shape})\n"
def plot(self, date_debut=None, date_fin=None)

affichage interactif des num_tombee en fonction de la date de fab en precisant date_debut et date_fin, on vient resserrer la fenetre de visualisation les dates peuvent être à structure variable: '2021' (année), '2021-01' (mois), '2021-05-23' (jour)

Expand source code
def plot(self, date_debut=None, date_fin=None):
    '''affichage interactif des num_tombee en fonction de la date de fab
    en precisant date_debut et date_fin, on vient resserrer la fenetre de visualisation
    les dates peuvent être à structure variable: '2021' (année), '2021-01' (mois), '2021-05-23' (jour)
    '''
    dataset_copy = self.dataset.copy()
    if (date_debut==None):
        date_debut=dataset_copy.Date_Fab.min()
    if (date_fin==None):
        date_fin=dataset_copy.Date_Fab.max()

    output_notebook()
    source_donnees = ColumnDataSource(dataset_copy[(dataset_copy.Date_Fab >= pd.to_datetime(date_debut))
                                                 & (dataset_copy.Date_Fab <= pd.to_datetime(date_fin))])
    TOOLS = "xpan,xwheel_zoom,box_zoom,crosshair, reset,save"
    p = figure(x_axis_type='datetime', active_scroll='xwheel_zoom', tools=TOOLS,plot_width=900, plot_height=500)

    p.line(x='Date_Fab', y='Num_Tombee', source=source_donnees)

    p.circle(x='Date_Fab', y='Num_Tombee', size=3, line_color="green",
             fill_color="white", line_width=1, source=source_donnees, legend_label=self.name)

    hover = HoverTool(tooltips=[('Date tombée','@Date_Fab{%Y-%m-%d %H:%M:%S}'),
                            ('Num tombée', '@Num_Tombee')],
                  formatters={'@Date_Fab':'datetime'})
    p.add_tools(hover)
    p.title.text = "Num_tombee en fonction de la date"
    show(p)
def plot_density_per_week(self, without_duplicate=False)

affiche le nombre d'observations par semaine si without_duplicate=True, on drop les doublons sur le critere ['Num_Tombee', 'Date_Fab'] sinon on les affiche en rouge (par défaut)

Expand source code
def plot_density_per_week(self, without_duplicate=False):
    '''affiche le nombre d'observations par semaine
    si without_duplicate=True, on drop les doublons sur le critere ['Num_Tombee', 'Date_Fab']
    sinon on les affiche en rouge (par défaut)
    '''
    dataset_copy = self.dataset.copy()
    if (without_duplicate):
        dataset_copy.drop_duplicates(subset=['Date_Fab', 'Num_Tombee'], inplace=True)
    # add columns for week and year of the date
    dataset_copy['date_week'] = dataset_copy['Date_Fab'].apply(lambda x: x.isocalendar()[1])
    dataset_copy['date_year'] = dataset_copy['Date_Fab'].apply(lambda x: x.isocalendar()[0])

    dataset_unique = dataset_copy.drop_duplicates(subset=['Date_Fab', 'Num_Tombee'])
    dataset_doublon = dataset_copy.loc[dataset_copy.index.difference(dataset_unique.index)]
    groupage_unique = dataset_unique.groupby([dataset_unique['date_year'],dataset_unique['date_week']])['Num_Tombee'].count()
    groupage_doublon = dataset_doublon.groupby([dataset_doublon['date_year'],dataset_doublon['date_week']])['Num_Tombee'].count()

    graph_rft = pd.concat([groupage_unique, groupage_doublon], axis=1)
    graph_rft.columns=['Unique', 'Doublons']
    graph_rft=graph_rft[['Unique', 'Doublons']]

    graph_rft=graph_rft.reindex(self._create_tempo_df(dataset_copy).index)
    graph_rft=graph_rft.reset_index(level=[0,1])
    graph_rft['index']=graph_rft['date_year'].apply(str)+'-'+graph_rft['date_week'].apply(str)
    graph_rft.fillna(0, inplace=True)
    graph_rft['total']=graph_rft['Unique']+graph_rft['Doublons']
#     graph_rft['index']=graph_rft['index'].astype('int64')
    graph_rft.set_index(['index'], inplace=True)

    graph_rft.drop(['date_year', 'date_week'], axis=1, inplace=True)

#     return graph_rft

    colors = ["green" , "red"]
    barWidth = 0.7
#         graph_rft.plot.bar(stacked=True, color=colors, figsize=(17,7),width=barWidth)
#         plt.show()

    output_notebook()
    TOOLS = "xpan,xwheel_zoom,crosshair, reset,save"

    p = figure(x_range=list(graph_rft.index), title="Density plot "+self.name,
               tools=TOOLS, active_scroll='xwheel_zoom', plot_width=900, plot_height=500)
    v = p.vbar_stack(['Unique', 'Doublons'], x='index', width=barWidth, color=colors,
                 source=graph_rft, line_color=None)

    tooltips = [
        ("Total ", "@total"),
        ("Unique ", "@Unique"),
        ("Doublons ", "@Doublons"),
        ('# de semaine ', "@index")
    ]

    hover = HoverTool(tooltips=tooltips)
    p.add_tools(hover)
#     item1 = LegendItem({'label':'Unique', 'renderers':[p.renderers[0]]});
#     item2 = LegendItem({'label':'Doublons', 'renderers':[p.renderers[1]]});
#     legend = Legend(items=[item1, item2])
#     p.add_layout(legend)

    legend=Legend(items=[
        ("Unique",   [v[0]]),
        ("Doublons",   [v[1]])
    ], location=(0, -30))
    p.add_layout(legend)

    p.legend.orientation = "horizontal"
    p.legend.location = "top_center"
    p.legend.click_policy="hide"

    p.xaxis.major_label_orientation = 3*pi/8
    p.xaxis.axis_label_text_font_size = "5pt"
    p.xaxis.major_label_text_font_size = "5pt"
    p.xaxis.axis_label_text_font = "times"
    p.xaxis.axis_label_text_color = "black"

    show(p)
def plot_density_per_week_matplotlib(self, without_duplicate=False)

affiche le nombre d'observations par semaine si without_duplicate=True, on drop les doublons sur le critere ['Num_Tombee', 'Date_Fab'] sinon on les affiche en rouge (par défaut)

Expand source code
def plot_density_per_week_matplotlib(self, without_duplicate=False):
    '''affiche le nombre d'observations par semaine
    si without_duplicate=True, on drop les doublons sur le critere ['Num_Tombee', 'Date_Fab']
    sinon on les affiche en rouge (par défaut)
    '''
    dataset_copy = self.dataset.copy()
    if (without_duplicate):
        dataset_copy.drop_duplicates(subset=['Date_Fab', 'Num_Tombee'], inplace=True)
    # add columns for week and year of the date
    dataset_copy['date_week'] = dataset_copy['Date_Fab'].apply(lambda x: x.isocalendar()[1])
    dataset_copy['date_year'] = dataset_copy['Date_Fab'].apply(lambda x: x.isocalendar()[0])

    dataset_unique = dataset_copy.drop_duplicates(subset=['Date_Fab', 'Num_Tombee'])
    dataset_doublon = dataset_copy.loc[dataset_copy.index.difference(dataset_unique.index)]
    groupage_unique = dataset_unique.groupby([dataset_unique['date_year'],dataset_unique['date_week']])['Num_Tombee'].count()
    groupage_doublon = dataset_doublon.groupby([dataset_doublon['date_year'],dataset_doublon['date_week']])['Num_Tombee'].count()

    graph_rft = pd.concat([groupage_unique, groupage_doublon], axis=1)
    graph_rft.columns=['Unique', 'Doublons']
    graph_rft=graph_rft[['Unique', 'Doublons']]

    graph_rft=graph_rft.reindex(self._create_tempo_df(dataset_copy).index)

    colors = ["green" , "red"]
    barWidth = 0.85
    graph_rft.plot.bar(stacked=True, color=colors, figsize=(17,7),width=barWidth)
    plt.show()
class STAM (dataset, name, description='', date_calendaire=False)

Hérite de DateFab_NumTombee_Dataset (Pour stocker les datasets contenant les clés Date_Fab et Num_Tombee) Date_Fab_complet est horodatée et permet de faire des passages entre date calendaire et date michelin Date_Fab_complet est créé à l'initialisation Date_Fab n'est pas horodaté

les attributs: - dataset : une copie du dataframe - name : le nom (abrégé) du dataframe - description : une description en quelques mots - date_calendaire : False si les dates sont stockées en date Michelin, True si stockées en date Calendaire

Expand source code
class STAM(DateFab_NumTombee_Dataset):
    '''
    Hérite de DateFab_NumTombee_Dataset
    (Pour stocker les datasets contenant les clés Date_Fab et Num_Tombee)
    Date_Fab_complet est horodatée et permet de faire des passages entre date calendaire et date michelin
    Date_Fab_complet est créé à l'initialisation
    Date_Fab n'est pas horodaté
    '''
    def __init__(self, dataset, name, description='', date_calendaire = False):
        '''
        les attributs:
        - dataset : une copie du dataframe
        - name : le nom (abrégé) du dataframe
        - description : une description en quelques mots
        - date_calendaire : False si les dates sont stockées en date Michelin, True si stockées en date Calendaire
        '''
        super().__init__(dataset, name, description)
        self._create_dtdate_fom_datecomplet()
        self.date_calendaire= date_calendaire

    def get_info(self):
        '''get_info de DateFab_NumTombee_Dataset complété avec l'info de date_calendaire'''
        return super().get_info()+' '+f'Date calendaire: [{self.date_calendaire}]\n'

    def _create_dtdate_fom_datecomplet(self):
        '''
        fonction technique (pas appelable directement)
        si la colonne Date_Fab_complet existe déjà, on est dans le cas d'un dataset CLEAN
        donc on ne fait rien
        '''
        if not ('Date_Fab_complet' in self.dataset.columns):
            self.dataset['Date_Fab_complet']=self.dataset['Date_Fab']
            self.dataset['Date_Fab']=self.dataset['Date_Fab_complet'].dt.date
            self.dataset['Date_Fab']=self.dataset['Date_Fab'].astype('datetime64')

    def passage_date_Calendaire(self, heureEquipeA = 6):
        '''
        passe en heure calendaire depuis une heure Michelin
        seulement si date_calendaire == False

        pour info: la journée Michelin est incrémentée non pas à minuit mais en debut d'équipe A
        Dates Michelin:
        2021-01-23 23:00,  2021-01-23 02:00,  2021-01-23 05:59,  2021-01-24 06:05,
        devient
        Dates calendaire:
        2021-01-23 23:00,  2021-01-24 02:00,  2021-01-24 05:59,  2021-01-24 06:05,
        '''
        if (self.date_calendaire):
            print(self.get_info()+ 'déjà en date Calendaire\n')
        else:
            self.dataset['Date_Fab_complet']=self.dataset['Date_Fab_complet'].apply(lambda row:self._ajoute_un_jour(row, heureEquipeA))
            self.dataset['Date_Fab_complet']=self.dataset['Date_Fab_complet'].astype('datetime64')
            self.date_calendaire = True
            self.dataset.sort_values('Date_Fab_complet', inplace=True)
            self.dataset['Date_Fab']=self.dataset['Date_Fab_complet'].dt.date
            self.dataset['Date_Fab']=self.dataset['Date_Fab'].astype('datetime64')

    def passage_date_Michelin(self, heureEquipeA = 6):
        '''
        passe en heure Michelin depuis une heure calendaire
        seulement si date_calendaire == True

        pour info: la journée Michelin est incrémentée non pas à minuit mais en debut d'équipe A
        Dates calendaire:
        2021-01-23 23:00,  2021-01-24 02:00,  2021-01-24 05:59,  2021-01-24 06:05,
        devient
        Dates Michelin:
        2021-01-23 23:00,  2021-01-23 02:00,  2021-01-23 05:59,  2021-01-24 06:05,
        '''
        if (not self.date_calendaire):
            print(self.get_info()+ 'déjà en date Michelin\n')
        else:
            self.dataset['Date_Fab_complet']=self.dataset['Date_Fab_complet'].apply(lambda row:self._retire_un_jour(row, heureEquipeA))
            self.dataset['Date_Fab_complet']=self.dataset['Date_Fab_complet'].astype('datetime64')
            self.date_calendaire = False
            self.dataset.sort_values('Date_Fab_complet', inplace=True)
            self.dataset['Date_Fab']=self.dataset['Date_Fab_complet'].dt.date
            self.dataset['Date_Fab']=self.dataset['Date_Fab'].astype('datetime64')


    def _ajoute_un_jour(self, date, heureEquipeA):
        '''
        fonction technique (pas appelable directement)
        '''
        heure = date.hour
        if (heure < heureEquipeA):
            return date+np.timedelta64(24, 'h')
        return date

    def _retire_un_jour(self, date, heureEquipeA):
        '''
        fonction technique (pas appelable directement)
        '''
        heure = date.hour
        if (heure < heureEquipeA):
            return date-np.timedelta64(24, 'h')
        return date

    def supprime_doublons(self):
        '''si 2 lignes ont la meme Date_Fab_complet+Num_Tombee,
        on ne garde que la dernière mesure (devrait correspondre à CE)
        (en rediscuter avec Fred)
        '''
        self.dataset.sort_values(['Date_Mes'], inplace=True)
        self.dataset.drop_duplicates(subset=['Date_Fab_complet', 'Num_Tombee'], keep='last', inplace=True)
        self.name = self.name+' sans doublon'
        self.description = self.description + '\n sans doublon'
        self.dataset.sort_values(['Date_Fab_complet'], inplace=True)

    def extraire_periode(self, date_debut, date_fin):
        '''
        retourne un objet STAM
        en ne gardant le contenu du dataset obéissant à date_debut<= Date_Fab <= date_fin

        les dates peuvent être à structure variable: '2021' (année), '2021-01' (mois), '2021-05-23' (jour)
        '''
        sous_dataset=self.dataset.copy()[(self.dataset.Date_Fab >= pd.to_datetime(date_debut))
                                                     & (self.dataset.Date_Fab <= pd.to_datetime(date_fin))]
        nouveauSTAM = STAM(sous_dataset, self.name, self.description+f' filtré entre {date_debut} et {date_fin}.', date_calendaire=self.date_calendaire)
        return nouveauSTAM


    def plot(self, date_debut=None, date_fin=None):
        '''affichage interactif des num_tombee en fonction de la date de fab complet
        en precisant date_debut et date_fin, on vient resserrer la fenetre de visualisation
        les dates peuvent être à structure variable: '2021' (année), '2021-01' (mois), '2021-05-23' (jour)

        il y a 2 courbes, en vert les tests nonCE, en rouge les tests CE
        si on clique dans la legende on peut venir n'afficher que la courbe de son choix
        '''
        mergeStam_copy = self.dataset.copy()
        if (date_debut==None):
            date_debut=mergeStam_copy.Date_Fab_complet.min()
        if (date_fin==None):
            date_fin=mergeStam_copy.Date_Fab_complet.max()

        # quand mergeStam_copy['CE'] est de type object, on est sur un STAM merge (avec des entrées 'CE' et nan)
        # quand mergeStam_copy['CE'] est de type int64, on est sur un STAM clean (avec des entrées 1 et 0)
        # on passe tout dans le style clean

        if (mergeStam_copy['CE'].dtypes == 'object'):
            mergeStam_copy['CE'] = mergeStam_copy['CE'].str.strip()
            mergeStam_copy['CE'].fillna(0,inplace=True)
            mergeStam_copy['CE'].replace('CE', 1, inplace=True)
            mergeStam_copy['CE'] = mergeStam_copy['CE'].astype('int64')

        output_notebook()
        source_stam = ColumnDataSource(mergeStam_copy[(mergeStam_copy.Date_Fab_complet >= pd.to_datetime(date_debut))
                                                     & (mergeStam_copy.Date_Fab_complet <= pd.to_datetime(date_fin))])
        source_stam_CE = ColumnDataSource(mergeStam_copy[(mergeStam_copy.Date_Fab_complet >= pd.to_datetime(date_debut))
                                                     & (mergeStam_copy.Date_Fab_complet <= pd.to_datetime(date_fin))
                                                     & (mergeStam_copy.CE == 1)   ])
        source_stam_noCE = ColumnDataSource(mergeStam_copy[(mergeStam_copy.Date_Fab_complet >= pd.to_datetime(date_debut))
                                                     & (mergeStam_copy.Date_Fab_complet <= pd.to_datetime(date_fin))
                                                     & (mergeStam_copy.CE == 0)   ])


        TOOLS = "xpan,xwheel_zoom,box_zoom,crosshair, reset,save"
        p = figure(x_axis_type='datetime', active_scroll='xwheel_zoom', tools=TOOLS,plot_width=900, plot_height=500)

        p.line(x='Date_Fab_complet', y='Num_Tombee', source=source_stam)

        noce = p.circle(x='Date_Fab_complet', y='Num_Tombee', size=3, line_color="green",
                 fill_color="white", line_width=1, source=source_stam_noCE, legend_label='pas de CE')
        ce = p.circle(x='Date_Fab_complet', y='Num_Tombee', size=3, line_color="red",
                 fill_color="white", line_width=1, source=source_stam_CE, legend_label='avec CE')

        #le mode vline c'est la barre verticale qui appelle la liste des points à cette date
        #le mode mouse est plus ciblé et plus performant
        hover = HoverTool(renderers=[ce, noce],tooltips=[('Date tombée','@Date_Fab_complet{%Y-%m-%d %H:%M:%S}'),
                                                         ('Date mesure','@Date_Mes{%Y-%m-%d %H:%M:%S}'),
                                                         ('Num tombée', '@Num_Tombee'), ('CE', '@CE')],
                      formatters={'@Date_Fab_complet':'datetime', '@Date_Mes':'datetime'}, mode='mouse')
        p.add_tools(hover)
        p.title.text = "Num_tombee en fonction de la date"
        p.legend.location = "top_left"
        p.legend.click_policy="hide"
        show(p)

Ancestors

Methods

def extraire_periode(self, date_debut, date_fin)

retourne un objet STAM en ne gardant le contenu du dataset obéissant à date_debut<= Date_Fab <= date_fin

les dates peuvent être à structure variable: '2021' (année), '2021-01' (mois), '2021-05-23' (jour)

Expand source code
def extraire_periode(self, date_debut, date_fin):
    '''
    retourne un objet STAM
    en ne gardant le contenu du dataset obéissant à date_debut<= Date_Fab <= date_fin

    les dates peuvent être à structure variable: '2021' (année), '2021-01' (mois), '2021-05-23' (jour)
    '''
    sous_dataset=self.dataset.copy()[(self.dataset.Date_Fab >= pd.to_datetime(date_debut))
                                                 & (self.dataset.Date_Fab <= pd.to_datetime(date_fin))]
    nouveauSTAM = STAM(sous_dataset, self.name, self.description+f' filtré entre {date_debut} et {date_fin}.', date_calendaire=self.date_calendaire)
    return nouveauSTAM
def get_info(self)

get_info de DateFab_NumTombee_Dataset complété avec l'info de date_calendaire

Expand source code
def get_info(self):
    '''get_info de DateFab_NumTombee_Dataset complété avec l'info de date_calendaire'''
    return super().get_info()+' '+f'Date calendaire: [{self.date_calendaire}]\n'
def passage_date_Calendaire(self, heureEquipeA=6)

passe en heure calendaire depuis une heure Michelin seulement si date_calendaire == False

pour info: la journée Michelin est incrémentée non pas à minuit mais en debut d'équipe A Dates Michelin: 2021-01-23 23:00, 2021-01-23 02:00, 2021-01-23 05:59, 2021-01-24 06:05, devient Dates calendaire: 2021-01-23 23:00, 2021-01-24 02:00, 2021-01-24 05:59, 2021-01-24 06:05,

Expand source code
def passage_date_Calendaire(self, heureEquipeA = 6):
    '''
    passe en heure calendaire depuis une heure Michelin
    seulement si date_calendaire == False

    pour info: la journée Michelin est incrémentée non pas à minuit mais en debut d'équipe A
    Dates Michelin:
    2021-01-23 23:00,  2021-01-23 02:00,  2021-01-23 05:59,  2021-01-24 06:05,
    devient
    Dates calendaire:
    2021-01-23 23:00,  2021-01-24 02:00,  2021-01-24 05:59,  2021-01-24 06:05,
    '''
    if (self.date_calendaire):
        print(self.get_info()+ 'déjà en date Calendaire\n')
    else:
        self.dataset['Date_Fab_complet']=self.dataset['Date_Fab_complet'].apply(lambda row:self._ajoute_un_jour(row, heureEquipeA))
        self.dataset['Date_Fab_complet']=self.dataset['Date_Fab_complet'].astype('datetime64')
        self.date_calendaire = True
        self.dataset.sort_values('Date_Fab_complet', inplace=True)
        self.dataset['Date_Fab']=self.dataset['Date_Fab_complet'].dt.date
        self.dataset['Date_Fab']=self.dataset['Date_Fab'].astype('datetime64')
def passage_date_Michelin(self, heureEquipeA=6)

passe en heure Michelin depuis une heure calendaire seulement si date_calendaire == True

pour info: la journée Michelin est incrémentée non pas à minuit mais en debut d'équipe A Dates calendaire: 2021-01-23 23:00, 2021-01-24 02:00, 2021-01-24 05:59, 2021-01-24 06:05, devient Dates Michelin: 2021-01-23 23:00, 2021-01-23 02:00, 2021-01-23 05:59, 2021-01-24 06:05,

Expand source code
def passage_date_Michelin(self, heureEquipeA = 6):
    '''
    passe en heure Michelin depuis une heure calendaire
    seulement si date_calendaire == True

    pour info: la journée Michelin est incrémentée non pas à minuit mais en debut d'équipe A
    Dates calendaire:
    2021-01-23 23:00,  2021-01-24 02:00,  2021-01-24 05:59,  2021-01-24 06:05,
    devient
    Dates Michelin:
    2021-01-23 23:00,  2021-01-23 02:00,  2021-01-23 05:59,  2021-01-24 06:05,
    '''
    if (not self.date_calendaire):
        print(self.get_info()+ 'déjà en date Michelin\n')
    else:
        self.dataset['Date_Fab_complet']=self.dataset['Date_Fab_complet'].apply(lambda row:self._retire_un_jour(row, heureEquipeA))
        self.dataset['Date_Fab_complet']=self.dataset['Date_Fab_complet'].astype('datetime64')
        self.date_calendaire = False
        self.dataset.sort_values('Date_Fab_complet', inplace=True)
        self.dataset['Date_Fab']=self.dataset['Date_Fab_complet'].dt.date
        self.dataset['Date_Fab']=self.dataset['Date_Fab'].astype('datetime64')
def plot(self, date_debut=None, date_fin=None)

affichage interactif des num_tombee en fonction de la date de fab complet en precisant date_debut et date_fin, on vient resserrer la fenetre de visualisation les dates peuvent être à structure variable: '2021' (année), '2021-01' (mois), '2021-05-23' (jour)

il y a 2 courbes, en vert les tests nonCE, en rouge les tests CE si on clique dans la legende on peut venir n'afficher que la courbe de son choix

Expand source code
def plot(self, date_debut=None, date_fin=None):
    '''affichage interactif des num_tombee en fonction de la date de fab complet
    en precisant date_debut et date_fin, on vient resserrer la fenetre de visualisation
    les dates peuvent être à structure variable: '2021' (année), '2021-01' (mois), '2021-05-23' (jour)

    il y a 2 courbes, en vert les tests nonCE, en rouge les tests CE
    si on clique dans la legende on peut venir n'afficher que la courbe de son choix
    '''
    mergeStam_copy = self.dataset.copy()
    if (date_debut==None):
        date_debut=mergeStam_copy.Date_Fab_complet.min()
    if (date_fin==None):
        date_fin=mergeStam_copy.Date_Fab_complet.max()

    # quand mergeStam_copy['CE'] est de type object, on est sur un STAM merge (avec des entrées 'CE' et nan)
    # quand mergeStam_copy['CE'] est de type int64, on est sur un STAM clean (avec des entrées 1 et 0)
    # on passe tout dans le style clean

    if (mergeStam_copy['CE'].dtypes == 'object'):
        mergeStam_copy['CE'] = mergeStam_copy['CE'].str.strip()
        mergeStam_copy['CE'].fillna(0,inplace=True)
        mergeStam_copy['CE'].replace('CE', 1, inplace=True)
        mergeStam_copy['CE'] = mergeStam_copy['CE'].astype('int64')

    output_notebook()
    source_stam = ColumnDataSource(mergeStam_copy[(mergeStam_copy.Date_Fab_complet >= pd.to_datetime(date_debut))
                                                 & (mergeStam_copy.Date_Fab_complet <= pd.to_datetime(date_fin))])
    source_stam_CE = ColumnDataSource(mergeStam_copy[(mergeStam_copy.Date_Fab_complet >= pd.to_datetime(date_debut))
                                                 & (mergeStam_copy.Date_Fab_complet <= pd.to_datetime(date_fin))
                                                 & (mergeStam_copy.CE == 1)   ])
    source_stam_noCE = ColumnDataSource(mergeStam_copy[(mergeStam_copy.Date_Fab_complet >= pd.to_datetime(date_debut))
                                                 & (mergeStam_copy.Date_Fab_complet <= pd.to_datetime(date_fin))
                                                 & (mergeStam_copy.CE == 0)   ])


    TOOLS = "xpan,xwheel_zoom,box_zoom,crosshair, reset,save"
    p = figure(x_axis_type='datetime', active_scroll='xwheel_zoom', tools=TOOLS,plot_width=900, plot_height=500)

    p.line(x='Date_Fab_complet', y='Num_Tombee', source=source_stam)

    noce = p.circle(x='Date_Fab_complet', y='Num_Tombee', size=3, line_color="green",
             fill_color="white", line_width=1, source=source_stam_noCE, legend_label='pas de CE')
    ce = p.circle(x='Date_Fab_complet', y='Num_Tombee', size=3, line_color="red",
             fill_color="white", line_width=1, source=source_stam_CE, legend_label='avec CE')

    #le mode vline c'est la barre verticale qui appelle la liste des points à cette date
    #le mode mouse est plus ciblé et plus performant
    hover = HoverTool(renderers=[ce, noce],tooltips=[('Date tombée','@Date_Fab_complet{%Y-%m-%d %H:%M:%S}'),
                                                     ('Date mesure','@Date_Mes{%Y-%m-%d %H:%M:%S}'),
                                                     ('Num tombée', '@Num_Tombee'), ('CE', '@CE')],
                  formatters={'@Date_Fab_complet':'datetime', '@Date_Mes':'datetime'}, mode='mouse')
    p.add_tools(hover)
    p.title.text = "Num_tombee en fonction de la date"
    p.legend.location = "top_left"
    p.legend.click_policy="hide"
    show(p)
def supprime_doublons(self)

si 2 lignes ont la meme Date_Fab_complet+Num_Tombee, on ne garde que la dernière mesure (devrait correspondre à CE) (en rediscuter avec Fred)

Expand source code
def supprime_doublons(self):
    '''si 2 lignes ont la meme Date_Fab_complet+Num_Tombee,
    on ne garde que la dernière mesure (devrait correspondre à CE)
    (en rediscuter avec Fred)
    '''
    self.dataset.sort_values(['Date_Mes'], inplace=True)
    self.dataset.drop_duplicates(subset=['Date_Fab_complet', 'Num_Tombee'], keep='last', inplace=True)
    self.name = self.name+' sans doublon'
    self.description = self.description + '\n sans doublon'
    self.dataset.sort_values(['Date_Fab_complet'], inplace=True)

Inherited members