main.py 4.65 KB
Newer Older
Romain Creuzenet's avatar
Romain Creuzenet committed
1
2
3
"""File to execute to show results"""
import numpy as np
import matplotlib.pyplot as plt
Romain Creuzenet's avatar
Romain Creuzenet committed
4
from datetime import datetime, timedelta
Romain Creuzenet's avatar
Romain Creuzenet committed
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from parameters import SESSION


def execute_query(query):
    for row in SESSION.execute(query):
        yield row


def ask_q(possibilities, text=">>> "):
    answer = None
    while answer not in possibilities:
        answer = input(text)
    return answer


class Manager:
    table = None  # table name use by the function

    def run(self):
        """Chose"""
        print("Choisissez ce que vous voulez faire")
        print("\t1 - Pour un point donné de l’espace, je veux pouvoir avoir un historique du passé")
        print("\t2 - À un instant donné je veux pouvoir obtenir une carte me représentant n’importe quel indicateur")
        print("\t3 - Pour une période de temps donnée, je veux pouvoir obtenir clusteriser l’espace, et représenter "
              "cette clusterisation")

        decision = {
            "1": "historic",
            "2": "map",
            "3": "cluster"
        }
        answer = ask_q(decision.keys())
        getattr(self, decision[answer])()

    def historic(self):
        self.table = "TABLE_SPACE"

        # Search station
Romain Creuzenet's avatar
Romain Creuzenet committed
43
        stations = []
Romain Creuzenet's avatar
Romain Creuzenet committed
44
        print("Choisissez une station parmis celles-ci:")
Romain Creuzenet's avatar
Romain Creuzenet committed
45
46
47
48
49
50
51
        query = "SELECT DISTINCT station FROM {}".format(self.table)
        for i, row in enumerate(execute_query(query), 1):
            end = "\n" if i % 3 == 0 else ""
            print("\t", row.station, end=end)
            stations.append(row.station)
        print()

Romain Creuzenet's avatar
Romain Creuzenet committed
52
53
54
55
56
57
58
59
60
61
62
63
64
65
        station = ask_q(stations)

        # Search element
        decision = {
            "tmpf": "La témparature",
            "relh": "L'humidité"
        }
        print("Choisissez un élément parmis les suivant :")
        for code, text in decision.items():
            print("\t-", text, ":", code)
        attr = ask_q(decision.keys())

        x = []
        y = []
Romain Creuzenet's avatar
Romain Creuzenet committed
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
        saisons = {
            'spring': {
                'n': 0,
                'somme': 0,
                'month': [3, 4, 5],  # March - May
                'end': lambda dt: datetime(dt.year, 6, 1) - timedelta(days=1),
                'legend': False,
                'color': 'r'
            },
            'summer': {
                'n': 0,
                'somme': 0,
                'month': [6, 7, 8],  # June - August
                'end': lambda dt: datetime(dt.year, 9, 1) - timedelta(days=1),
                'legend': False,
                'color': 'y'
            },
            'automne': {
                'n': 0,
                'somme': 0,
                'month': [9, 10, 11],  # September - November
                'end': lambda dt: datetime(dt.year, 12, 1) - timedelta(days=1),
                'legend': False,
                'color': 'm'
            },
            'winter': {
                'n': 0,
                'somme': 0,
                'month': [12, 1, 2],  # December - Febrarie
                'end': lambda dt: datetime(dt.year + 1, 3, 1) - timedelta(days=1),
                'legend': False,
                'color': 'k'
            }
        }
Romain Creuzenet's avatar
Romain Creuzenet committed
100
101
        query = "SELECT * FROM {} WHERE station={}".format(self.table, station.__repr__())
        for row in execute_query(query):
Romain Creuzenet's avatar
Romain Creuzenet committed
102
103
104
            value = getattr(row, attr)
            if value is None:
                continue
Romain Creuzenet's avatar
Romain Creuzenet committed
105
            x.append(datetime(*list(row.time)))
Romain Creuzenet's avatar
Romain Creuzenet committed
106
107
108
109
110
111
112
113
114
            y.append(value)
            # For saison
            for saison, d in saisons.items():
                if row.time[1] in d['month']:
                    d['n'] += 1
                    d['somme'] += value
                    break

        date, last_date = x[0], x[-1]  # first date and last date, initialisation
Romain Creuzenet's avatar
Romain Creuzenet committed
115
116
117
        x = np.array(x)
        y = np.array(y)
        plt.plot(x, y, label=attr)
Romain Creuzenet's avatar
Romain Creuzenet committed
118
119
120
121
122
123
124
125
126
127
128
129
130
131

        # Mark saison
        while date < last_date:
            for saison, d in saisons.items():
                if date.month in d['month']:
                    next_date = min(last_date, d['end'](date))
                    moyenne = d['somme'] / d['n']
                    if d['legend']:
                        plt.plot([date, next_date], [moyenne, moyenne], d['color'], linewidth=4)
                    else:
                        plt.plot([date, next_date], [moyenne, moyenne], d['color'], label=saison, linewidth=4)
                        d['legend'] = True
                    date = next_date + timedelta(days=1)
                    break
Romain Creuzenet's avatar
Romain Creuzenet committed
132
133
134
135
136
137
138
139
140
141
142
143
144
        plt.title(station)
        plt.legend()
        plt.show()

    def map(self):
        print("Cette fonction n'est pas implémentée")

    def cluster(self):
        print("Cette fonction n'est pas implémentée")


if __name__ == "__main__":
    Manager().run()