]> AND Private Git Repository - predictops.git/blob - predictops/source/holidays.py
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
6893db03ef5ef7eb804d3f1d9ec391cf18a2dcaf
[predictops.git] / predictops / source / holidays.py
1 from configparser import ConfigParser
2 from datetime import datetime, timedelta
3 from jours_feries_france.compute import JoursFeries
4 from logging import getLogger
5 from logging.config import fileConfig
6 from pathlib import Path
7 from vacances_scolaires_france import SchoolHolidayDates
8
9 import itertools
10
11 fileConfig((Path.cwd() / 'config') / 'logging.cfg')
12 logger = getLogger()
13
14 class Holidays:
15
16     _start = None
17     _end   = None
18
19     def __init__(self, config_file):
20
21         self._config = ConfigParser()
22         self._config.read(config_file)
23
24         # Collecting holidays features
25         self._features = [section for section in self._config
26                               if self._config[section].getboolean('numerical')
27                               or self._config[section].getboolean('categorical')]
28
29         self._dated_features = {}
30
31
32     @property
33     def start(self):
34         return self._start
35
36     @start.setter
37     def start(self, x):
38         self._start = x
39
40
41     @property
42     def end(self):
43         return self._end
44
45     @end.setter
46     def end(self, x):
47         self._end = x
48
49
50
51     def _get_academic_zone(self, name, date):
52         dict_zones = {
53         'Caen' : ('A', 'B'),
54         'Clermont-Ferrand' : ('A', 'A'),
55         'Grenoble' : ('A', 'A'),
56         'Lyon' : ('A', 'A'),
57         'Montpellier' : ('A', 'C'),
58         'Nancy-Metz' : ('A', 'B'),
59         'Nantes' : ('A', 'B'),
60         'Rennes' : ('A', 'B'),
61         'Toulouse' : ('A', 'C'),
62         'Aix-Marseille' : ('B', 'B'),
63         'Amiens' : ('B', 'B'),
64         'Besançon' : ('B', 'A'),
65         'Dijon' : ('B', 'A'),
66         'Lille' : ('B', 'B'),
67         'Limoges' : ('B', 'A'),
68         'Nice' : ('B', 'B'),
69         'Orléans-Tours' : ('B', 'B'),
70         'Poitiers' : ('B', 'A'),
71         'Reims' : ('B', 'B'),
72         'Rouen ' : ('B', 'B'),
73         'Strasbourg' : ('B', 'B'),
74         'Bordeaux' : ('C', 'A'),
75         'Créteil' : ('C', 'C'),
76         'Paris' : ('C', 'C'),
77         'Versailles' : ('C', 'C')
78         }
79         if date < datetime(2016, 1, 1):
80             return dict_zones[name][0]
81         else:
82             return dict_zones[name][1]
83
84
85     @property
86     def dated_features(self):
87         if self._dated_features == {}:
88             logger.info("Adding holidays features")
89             bankHolidays = tuple(itertools.chain.from_iterable(list(JoursFeries.for_year(k).values())
90                                            for k in range(self.start.year, self.end.year+1)))
91             bankHolidaysEve = tuple(u-timedelta(days=1) for u in bankHolidays)
92             name = self._config['ZONE']['name']
93             date = self._start
94             Date = datetime.date(date)
95             tomorrow = date + timedelta(days=1)
96             Tomorrow = datetime.date(tomorrow)
97             d = SchoolHolidayDates()
98             dict_hour = {
99                 'bankHolidays' : Date in bankHolidays,
100                 'bankHolidaysEve': Date in bankHolidaysEve,
101                 'holidays': d.is_holiday_for_zone(Date, self._get_academic_zone(name, date)),
102                 'holidaysEve': d.is_holiday_for_zone(Tomorrow, self._get_academic_zone(name, tomorrow))
103             }
104             while date <= self._end:
105                 self._dated_features[date] = dict_hour
106                 current = date
107                 date += timedelta(hours=1)
108                 if date.day != current.day:
109                     Date = datetime.date(date)
110                     tomorrow = date + timedelta(days=1)
111                     Tomorrow = datetime.date(tomorrow)
112                     dict_hour = {
113                         'bankHolidays' : Date in bankHolidays,
114                         'bankHolidaysEve': Date in bankHolidaysEve,
115                         'holidays': d.is_holiday_for_zone(Date, self._get_academic_zone(name, date)),
116                         'holidaysEve': d.is_holiday_for_zone(Tomorrow, self._get_academic_zone(name, tomorrow))
117                     }
118         return self._dated_features