sarapy 1.3.0__py3-none-any.whl → 2.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- sarapy/dataProcessing/OpsProcessor.py +68 -114
- sarapy/dataProcessing/TLMSensorDataProcessor.py +73 -764
- sarapy/dataProcessing/TimeSeriesProcessor.py +19 -1
- sarapy/mlProcessors/FertilizerTransformer.py +16 -29
- sarapy/mlProcessors/PlantinClassifier.py +3 -3
- sarapy/mlProcessors/PlantinFMCreator.py +39 -59
- sarapy/preprocessing/TransformInputData.py +115 -85
- sarapy/preprocessing/TransformToOutputData.py +4 -17
- sarapy/stats/__init__.py +1 -0
- sarapy/stats/stats.py +258 -0
- sarapy/utils/plotting.py +96 -0
- sarapy/version.py +1 -1
- {sarapy-1.3.0.dist-info → sarapy-2.0.0.dist-info}/METADATA +20 -1
- sarapy-2.0.0.dist-info/RECORD +29 -0
- sarapy-1.3.0.dist-info/RECORD +0 -26
- {sarapy-1.3.0.dist-info → sarapy-2.0.0.dist-info}/LICENCE +0 -0
- {sarapy-1.3.0.dist-info → sarapy-2.0.0.dist-info}/WHEEL +0 -0
- {sarapy-1.3.0.dist-info → sarapy-2.0.0.dist-info}/top_level.txt +0 -0
|
@@ -1,781 +1,90 @@
|
|
|
1
1
|
###Documentación en https://github.com/lucasbaldezzari/sarapy/blob/main/docs/Docs.md
|
|
2
|
-
|
|
3
2
|
import numpy as np
|
|
4
|
-
|
|
3
|
+
import pandas as pd
|
|
5
4
|
|
|
6
|
-
class TLMSensorDataProcessor(
|
|
5
|
+
class TLMSensorDataProcessor():
|
|
7
6
|
"""- Autor: BALDEZZARI Lucas
|
|
7
|
+
|
|
8
|
+
Estar clase sirve para entegar los datos de telemetría como un array de numpy. La idea es
|
|
9
|
+
poder acceder a los datos a través de indexación, ejemplos:
|
|
10
|
+
tlm_data[["INST_PT","INST_FT"],:] en este caso se obtienen los datos de las columnas INST_PT e INST_FT
|
|
8
11
|
|
|
9
|
-
Metadata utilizada: Versión 9
|
|
10
12
|
"""
|
|
11
13
|
|
|
12
|
-
def __init__(self,
|
|
13
|
-
"""Constructor de la clase MetadataManager
|
|
14
|
-
|
|
15
|
-
### Creamos constantes que sirven para buscar los datos en el string de telemetría
|
|
16
|
-
### Cada constante es una tupla con la posición del bit menos significativo y la posición del bit más significativo
|
|
17
|
-
self.__RFflag_pos = (0,0) #RF(1bit)
|
|
18
|
-
self.__GNSSflag_pos = (1,1) #GNSS(1bit)
|
|
19
|
-
self.__RFIDflag_pos = (2,2) #RFID(1bit)
|
|
20
|
-
self.__FLASHflag_pos = (3,3) #FLASH(1bit)
|
|
21
|
-
self.__RTCSflag_pos = (4,4) #RTCS(1bit)
|
|
22
|
-
self.__MODEflag_pos = (5,5) #MODE(1bit)
|
|
23
|
-
self.__NBAT_pos = (6,7) #NBAT(2bits)
|
|
24
|
-
self.__TIMEAC_pos = (8,14) #TIMEAC(8bits)
|
|
25
|
-
self.__ESTACflag_pos = (15,15) #ESTAC(1bit)
|
|
26
|
-
self.__DSTRPT_pos = (16,19) #DSTR PT(4bits)
|
|
27
|
-
self.__INESTPTflag_pos = (20,20) #INEST PT(1bit) Inestabilidad de plantín
|
|
28
|
-
self.__OFFSPT_pos = (21,22) #OFFS PT(2bits)
|
|
29
|
-
self.__DSTRFT_pos = (24,27) #DSTR FT(4bits)
|
|
30
|
-
self.__INESTFTflag_pos = (28,28) #INEST FT(1bit)
|
|
31
|
-
self.__OFFSFT_pos = (29,30) #OFFS FT(2bits)
|
|
32
|
-
self.__PMSTFlag = (31,31) #PMST(1bit)
|
|
33
|
-
self.__GYROX_pos = (32,34) #GYRO_X(3bits)
|
|
34
|
-
self.__GYROY_pos = (35,37) #GYRO_Y(3bits)
|
|
35
|
-
self.__GYROZf_pos = (38,39) #GYRO_Z(2bits)
|
|
36
|
-
self.__ACELX_pos = (40,41) #ACEL_X(2bits)
|
|
37
|
-
self.__ACELY_pos = (42,43) #ACEL_Y(2bits)
|
|
38
|
-
self.__ACELZ_pos = (44,45) #ACEL_Z(2bits)
|
|
39
|
-
self.__ESTMOflag_pos = (46,46) #EST MO(1bit)
|
|
40
|
-
self.__ESTORflag_pos = (47,47) #EST OR(1bit)
|
|
41
|
-
self.__SBAT_pos = (48,49) #SBAT(2bits) salud de la batería
|
|
42
|
-
self.__VBAT_pos = (50,52) #VBAT(3bits) voltaje de la batería
|
|
43
|
-
self.__CBAT_pos = (53,54) #CBAT(2bits) consumo de la batería
|
|
44
|
-
self.__ESTBMSflag_pos = (55,55) #EST BMS(1bit)
|
|
45
|
-
self.__FIX_pos = (56,58) #FIX(3bits)
|
|
46
|
-
self.__SIV_pos = (59,63) #SIV(5bits)
|
|
47
|
-
|
|
48
|
-
##creamos un diccionario para saber la posición de cada dato dentro del array devuelto por transform()
|
|
49
|
-
self._dataPositions = {
|
|
50
|
-
"RFFlag": 0, "GNSSFlag": 1, "RFIDFlag": 2, "FLASHFlag": 3, "RTCSFlag": 4,
|
|
51
|
-
"MODEFlag": 5, "NBAT": 6, "TIMEAC": 7, "ESTAC": 8, "DSTRPT": 9,
|
|
52
|
-
"INESTPT": 10, "OFFSPT": 11, "DSTRFT": 12, "INESTFT": 13, "OFFSFT": 14,
|
|
53
|
-
"PMSTFlag": 15, "GYROX": 16, "GYROY": 17, "GYROZ": 18, "ACELX": 19, "ACELY": 20,
|
|
54
|
-
"ACELZ": 21, "ESTMOFlag": 22, "ESTORFlag": 23, "SBAT": 24, "VBAT": 25, "CBAT": 26,
|
|
55
|
-
"ESTBMSFlag": 27, "FIX": 28, "SIV": 29}
|
|
14
|
+
def __init__(self, data:list):
|
|
15
|
+
"""Constructor de la clase MetadataManager
|
|
56
16
|
|
|
57
|
-
# self.kilometers = kwargs.pop('kilometers', 0)
|
|
58
|
-
self.is_fitted = False
|
|
59
|
-
|
|
60
|
-
def fit(self, X, y=None):
|
|
61
|
-
"""Método para generar datos a partir de la metadata.
|
|
62
|
-
|
|
63
|
-
Args:
|
|
64
|
-
- X: Es un array con los datos provenientes (strings) de la base de datos histórica. La forma de X es (n,1) donde n es la cantidad de datos.
|
|
65
|
-
"""
|
|
66
|
-
|
|
67
|
-
##chequeamos si todos los strings de X tienen la misma longitud, sino arrojamos un assert
|
|
68
|
-
assert all(len(x) == len(X[0]) for x in X), "Todos los strings de X deben tener la misma longitud"
|
|
69
|
-
|
|
70
|
-
self._RFFlag = np.vectorize(self.getRFFlag)(X)
|
|
71
|
-
self._GNSSFlag = np.vectorize(self.getGNSSFlag)(X)
|
|
72
|
-
self._RFIDFlag = np.vectorize(self.getRFIDFlag)(X)
|
|
73
|
-
self._FLASHFlag = np.vectorize(self.getFLASHFlag)(X)
|
|
74
|
-
self._RTCSFlag = np.vectorize(self.getRTCSFlag)(X)
|
|
75
|
-
self._MODEFlag = np.vectorize(self.getMODEFlag)(X)
|
|
76
|
-
self._NBAT = np.vectorize(self.getNBAT)(X)
|
|
77
|
-
self._TIMEAC = np.vectorize(self.getTIMEAC)(X)
|
|
78
|
-
self._ESTAC = np.vectorize(self.getESTAC)(X)
|
|
79
|
-
self._DSTRPT = np.vectorize(self.getDSTRPT)(X)
|
|
80
|
-
self._INESTPT = np.vectorize(self.getINESTPTFlag)(X)
|
|
81
|
-
self._OFFSPT = np.vectorize(self.getOFFSPT)(X)
|
|
82
|
-
self._DSTRFT = np.vectorize(self.getDSTRFT)(X)
|
|
83
|
-
self._INESTFT = np.vectorize(self.getINESTFTFlag)(X)
|
|
84
|
-
self._OFFSFT = np.vectorize(self.getOFFSFT)(X)
|
|
85
|
-
self._PMSTFlag = np.vectorize(self.getPMSTFlag)(X)
|
|
86
|
-
self._GYROX = np.vectorize(self.getGYROX)(X)
|
|
87
|
-
self._GYROY = np.vectorize(self.getGYROY)(X)
|
|
88
|
-
self._GYROZ = np.vectorize(self.getGYROZ)(X)
|
|
89
|
-
self._ACELX = np.vectorize(self.getACELX)(X)
|
|
90
|
-
self._ACELY = np.vectorize(self.getACELY)(X)
|
|
91
|
-
self._ACELZ = np.vectorize(self.getACELZ)(X)
|
|
92
|
-
self._ESTMOFlag = np.vectorize(self.getESTMOFlag)(X)
|
|
93
|
-
self._ESTORFlag = np.vectorize(self.getESTORFlag)(X)
|
|
94
|
-
self._SBAT = np.vectorize(self.getSBAT)(X)
|
|
95
|
-
self._VBAT = np.vectorize(self.getVBAT)(X)
|
|
96
|
-
self._CBAT = np.vectorize(self.getCBAT)(X)
|
|
97
|
-
self._ESTBMSFlag = np.vectorize(self.getESTBMSFlag)(X)
|
|
98
|
-
self._FIX = np.vectorize(self.getFIX)(X)
|
|
99
|
-
self._SIV = np.vectorize(self.getSIV)(X)
|
|
100
|
-
|
|
101
|
-
self.is_fitted = True
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
def transform(self, X, y=None):
|
|
105
|
-
"""Transforma los datos de entrada en un array de numpy.
|
|
106
|
-
|
|
107
17
|
Args:
|
|
108
|
-
-
|
|
18
|
+
- data: Es una lista de diccionarios (como un JSON) con los datos de telemetría.
|
|
109
19
|
"""
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
raise ValueError("TLMSensorDataProcessor no ha sido fitteado. Llame a fit() previamente.")
|
|
114
|
-
|
|
115
|
-
return np.array([ self._RFFlag,
|
|
116
|
-
self._GNSSFlag,
|
|
117
|
-
self._RFIDFlag,
|
|
118
|
-
self._FLASHFlag,
|
|
119
|
-
self._RTCSFlag,
|
|
120
|
-
self._MODEFlag,
|
|
121
|
-
self._NBAT,
|
|
122
|
-
self._TIMEAC,
|
|
123
|
-
self._ESTAC,
|
|
124
|
-
self._DSTRPT,
|
|
125
|
-
self._INESTPT,
|
|
126
|
-
self._OFFSPT,
|
|
127
|
-
self._DSTRFT,
|
|
128
|
-
self._INESTFT,
|
|
129
|
-
self._OFFSFT,
|
|
130
|
-
self._PMSTFlag,
|
|
131
|
-
self._GYROX,
|
|
132
|
-
self._GYROY,
|
|
133
|
-
self._GYROZ,
|
|
134
|
-
self._ACELX,
|
|
135
|
-
self._ACELY,
|
|
136
|
-
self._ACELZ,
|
|
137
|
-
self._ESTMOFlag,
|
|
138
|
-
self._ESTORFlag,
|
|
139
|
-
self._SBAT,
|
|
140
|
-
self._VBAT,
|
|
141
|
-
self._CBAT,
|
|
142
|
-
self._ESTBMSFlag,
|
|
143
|
-
self._FIX,
|
|
144
|
-
self._SIV]).T
|
|
20
|
+
#convierto a un DataFrame de pandas
|
|
21
|
+
self.data = pd.DataFrame(data)
|
|
22
|
+
self.keys = self.data.columns.tolist()
|
|
145
23
|
|
|
146
|
-
def
|
|
147
|
-
"""
|
|
24
|
+
def getData(self):
|
|
25
|
+
"""Devuelve los datos de telemetría como un numpy array.
|
|
148
26
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
"""
|
|
152
|
-
self.
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
----------
|
|
193
|
-
metadata: str
|
|
194
|
-
String con los metadatos obtenidos de la base de datos.
|
|
195
|
-
Return
|
|
196
|
-
------
|
|
197
|
-
int
|
|
198
|
-
Valor del flag RFID.
|
|
199
|
-
"""
|
|
200
|
-
|
|
201
|
-
return np.uint8(int(metadata[self.__RFIDflag_pos[0]:self.__RFIDflag_pos[1]+1],2))
|
|
202
|
-
|
|
203
|
-
def getFLASHFlag(self, metadata):
|
|
204
|
-
"""
|
|
205
|
-
Devuelve el valor del flag FLASH.
|
|
206
|
-
|
|
207
|
-
Parametros
|
|
208
|
-
----------
|
|
209
|
-
metadata: str
|
|
210
|
-
String con los metadatos obtenidos de la base de datos.
|
|
211
|
-
Return
|
|
212
|
-
------
|
|
213
|
-
int
|
|
214
|
-
Valor del flag FLASH.
|
|
215
|
-
"""
|
|
216
|
-
|
|
217
|
-
return np.uint8(int(metadata[self.__FLASHflag_pos[0]:self.__FLASHflag_pos[1]+1],2))
|
|
218
|
-
|
|
219
|
-
def getRTCSFlag(self, metadata):
|
|
220
|
-
"""
|
|
221
|
-
Devuelve el valor del flag RTCS.
|
|
222
|
-
|
|
223
|
-
Parametros
|
|
224
|
-
----------
|
|
225
|
-
metadata: str
|
|
226
|
-
String con los metadatos obtenidos de la base de datos.
|
|
227
|
-
Return
|
|
228
|
-
------
|
|
229
|
-
int
|
|
230
|
-
Valor del flag RTCS.
|
|
231
|
-
"""
|
|
232
|
-
|
|
233
|
-
return np.uint8(int(metadata[self.__RTCSflag_pos[0]:self.__RTCSflag_pos[1]+1],2))
|
|
234
|
-
|
|
235
|
-
def getMODEFlag(self, metadata):
|
|
236
|
-
"""
|
|
237
|
-
Devuelve el valor del flag MODE.
|
|
238
|
-
|
|
239
|
-
Parametros
|
|
240
|
-
----------
|
|
241
|
-
metadata: str
|
|
242
|
-
String con los metadatos obtenidos de la base de datos.
|
|
243
|
-
Return
|
|
244
|
-
------
|
|
245
|
-
|
|
246
|
-
int
|
|
247
|
-
Valor del flag MODE.
|
|
248
|
-
"""
|
|
249
|
-
|
|
250
|
-
return np.uint8(int(metadata[self.__MODEflag_pos[0]:self.__MODEflag_pos[1]+1],2))
|
|
251
|
-
|
|
252
|
-
def getNBAT(self, metadata):
|
|
253
|
-
"""
|
|
254
|
-
Devuelve el valor del flag NBAT.
|
|
255
|
-
|
|
256
|
-
Parametros
|
|
257
|
-
----------
|
|
258
|
-
metadata: str
|
|
259
|
-
String con los metadatos obtenidos de la base de datos.
|
|
260
|
-
Return
|
|
261
|
-
------
|
|
262
|
-
int
|
|
263
|
-
Valor del flag NBAT.
|
|
264
|
-
"""
|
|
265
|
-
|
|
266
|
-
return np.uint8(int(metadata[self.__NBAT_pos[0]:self.__NBAT_pos[1]+1],2))
|
|
267
|
-
|
|
268
|
-
def getTIMEAC(self, metadata):
|
|
269
|
-
"""
|
|
270
|
-
Devuelve el tiempo de accionamiento en segundos
|
|
271
|
-
|
|
272
|
-
Parametros
|
|
273
|
-
----------
|
|
274
|
-
metadata: str
|
|
275
|
-
String con los metadatos obtenidos de la base de datos.
|
|
276
|
-
Return
|
|
277
|
-
------
|
|
278
|
-
float
|
|
279
|
-
Tiempo de accionamiento en segundos.
|
|
280
|
-
"""
|
|
281
|
-
|
|
282
|
-
return np.float16(int(metadata[self.__TIMEAC_pos[0]:self.__TIMEAC_pos[1]+1],2)*0.1)
|
|
283
|
-
|
|
284
|
-
def getESTAC(self, metadata):
|
|
285
|
-
"""
|
|
286
|
-
Devuelve el valor del flag de ANOMALÍA OPERATIVA
|
|
287
|
-
|
|
288
|
-
Parametros
|
|
289
|
-
----------
|
|
290
|
-
metadata: str
|
|
291
|
-
String con los metadatos obtenidos de la base de datos.
|
|
292
|
-
Return
|
|
293
|
-
------
|
|
294
|
-
int
|
|
295
|
-
Valor del flag de ANOMALÍA OPERATIVA.
|
|
296
|
-
"""
|
|
297
|
-
|
|
298
|
-
return np.uint8(int(metadata[self.__ESTACflag_pos[0]:self.__ESTACflag_pos[1]+1],2))
|
|
299
|
-
|
|
300
|
-
def getDSTRPT(self, metadata):
|
|
301
|
-
"""
|
|
302
|
-
Devuelve el nivel de distorsión para plantín
|
|
303
|
-
|
|
304
|
-
Parametros
|
|
305
|
-
----------
|
|
306
|
-
metadata: str
|
|
307
|
-
String con los metadatos obtenidos de la base de datos.
|
|
308
|
-
Return
|
|
309
|
-
------
|
|
310
|
-
int:
|
|
311
|
-
Valor de distorsión para plantín.
|
|
312
|
-
"""
|
|
313
|
-
|
|
314
|
-
return np.uint8(int(metadata[self.__DSTRPT_pos[0]:self.__DSTRPT_pos[1]+1],2))
|
|
315
|
-
|
|
316
|
-
def getINESTPTFlag(self,metadata):
|
|
317
|
-
"""
|
|
318
|
-
Devuelve el valor del flag de INESTABILIDAD PARA PLANTÍN
|
|
319
|
-
|
|
320
|
-
Parametros
|
|
321
|
-
----------
|
|
322
|
-
metadata: str
|
|
323
|
-
String con los metadatos obtenidos de la base de datos.
|
|
324
|
-
Return
|
|
325
|
-
------
|
|
326
|
-
int:
|
|
327
|
-
Valor del flag de INESTABILIDAD PARA PLANTÍN.
|
|
328
|
-
"""
|
|
329
|
-
|
|
330
|
-
return np.uint8(int(metadata[self.__INESTPTflag_pos[0]:self.__INESTPTflag_pos[1]+1],2))
|
|
331
|
-
|
|
332
|
-
def getOFFSPT(self,metadata):
|
|
333
|
-
"""
|
|
334
|
-
Devuelve el valor del flag de OFFSET PARA PLANTÍN
|
|
335
|
-
|
|
336
|
-
Parametros
|
|
337
|
-
----------
|
|
338
|
-
metadata: str
|
|
339
|
-
String con los metadatos obtenidos de la base de datos.
|
|
340
|
-
Return
|
|
341
|
-
------
|
|
342
|
-
int:
|
|
343
|
-
Valor del flag de OFFSET PARA PLANTÍN.
|
|
344
|
-
"""
|
|
345
|
-
|
|
346
|
-
return np.uint8(int(metadata[self.__OFFSPT_pos[0]:self.__OFFSPT_pos[1]+1],2))
|
|
347
|
-
|
|
348
|
-
def getDSTRFT(self,metadata):
|
|
349
|
-
"""
|
|
350
|
-
Devuelve el nivel de distorsión para fertilizante
|
|
351
|
-
|
|
352
|
-
Parametros
|
|
353
|
-
----------
|
|
354
|
-
metadata: str
|
|
355
|
-
String con los metadatos obtenidos de la base de datos.
|
|
356
|
-
Return
|
|
357
|
-
------
|
|
358
|
-
int:
|
|
359
|
-
Valor de distorsión para fertilizante.
|
|
360
|
-
"""
|
|
361
|
-
|
|
362
|
-
return np.uint8(int(metadata[self.__DSTRFT_pos[0]:self.__DSTRFT_pos[1]+1],2))
|
|
363
|
-
|
|
364
|
-
def getINESTFTFlag(self,metadata):
|
|
365
|
-
"""
|
|
366
|
-
Devuelve el valor del flag de INESTABILIDAD PARA FERTILIZANTE
|
|
367
|
-
|
|
368
|
-
Parametros
|
|
369
|
-
----------
|
|
370
|
-
metadata: str
|
|
371
|
-
String con los metadatos obtenidos de la base de datos.
|
|
372
|
-
Return
|
|
373
|
-
------
|
|
374
|
-
int:
|
|
375
|
-
Valor del flag de INESTABILIDAD PARA FERTILIZANTE.
|
|
376
|
-
"""
|
|
377
|
-
|
|
378
|
-
return np.uint8(int(metadata[self.__INESTFTflag_pos[0]:self.__INESTFTflag_pos[1]+1],2))
|
|
379
|
-
|
|
380
|
-
def getOFFSFT(self,metadata):
|
|
381
|
-
"""
|
|
382
|
-
Devuelve el valor del flag de OFFSET PARA FERTILIZANTE
|
|
383
|
-
|
|
384
|
-
Parametros
|
|
385
|
-
----------
|
|
386
|
-
metadata: str
|
|
387
|
-
String con los metadatos obtenidos de la base de datos.
|
|
388
|
-
Return
|
|
389
|
-
------
|
|
390
|
-
int:
|
|
391
|
-
Valor del flag de OFFSET PARA FERTILIZANTE.
|
|
392
|
-
"""
|
|
393
|
-
|
|
394
|
-
return np.uint8(int(metadata[self.__OFFSFT_pos[0]:self.__OFFSFT_pos[1]+1],2))
|
|
395
|
-
|
|
396
|
-
def getPMSTFlag(self,metadata):
|
|
397
|
-
"""
|
|
398
|
-
Devuelve el valor del flag perdida de muestreo.
|
|
399
|
-
|
|
400
|
-
Parametros
|
|
401
|
-
----------
|
|
402
|
-
metadata: str
|
|
403
|
-
String con los metadatos obtenidos de la base de datos.
|
|
404
|
-
Return
|
|
405
|
-
------
|
|
406
|
-
int:
|
|
407
|
-
Valor de flag perdida de muestreo.
|
|
408
|
-
"""
|
|
409
|
-
|
|
410
|
-
return np.uint8(int(metadata[self.__PMSTFlag[0]:self.__PMSTFlag[1]+1],2))
|
|
411
|
-
|
|
412
|
-
def getGYROX(self,metadata):
|
|
413
|
-
"""
|
|
414
|
-
Devuelve el valor del giroscopio en X.
|
|
415
|
-
|
|
416
|
-
Parametros
|
|
417
|
-
----------
|
|
418
|
-
metadata: str
|
|
419
|
-
String con los metadatos obtenidos de la base de datos.
|
|
420
|
-
Return
|
|
421
|
-
------
|
|
422
|
-
int:
|
|
423
|
-
Valor del giroscopio en X.
|
|
424
|
-
"""
|
|
425
|
-
|
|
426
|
-
return np.uint8(int(metadata[self.__GYROX_pos[0]:self.__GYROX_pos[1]+1],2))
|
|
427
|
-
|
|
428
|
-
def getGYROY(self,metadata):
|
|
429
|
-
"""
|
|
430
|
-
Devuelve el valor del giroscopio en Y.
|
|
431
|
-
|
|
432
|
-
Parametros
|
|
433
|
-
----------
|
|
434
|
-
metadata: str
|
|
435
|
-
String con los metadatos obtenidos de la base de datos.
|
|
436
|
-
Return
|
|
437
|
-
------
|
|
438
|
-
int:
|
|
439
|
-
Valor del giroscopio en Y.
|
|
440
|
-
"""
|
|
441
|
-
|
|
442
|
-
return np.uint8(int(metadata[self.__GYROY_pos[0]:self.__GYROY_pos[1]+1],2))
|
|
443
|
-
|
|
444
|
-
def getGYROZ(self,metadata):
|
|
445
|
-
"""
|
|
446
|
-
Devuelve el valor del giroscopio en Z.
|
|
447
|
-
|
|
448
|
-
Parametros
|
|
449
|
-
----------
|
|
450
|
-
metadata: str
|
|
451
|
-
String con los metadatos obtenidos de la base de datos.
|
|
452
|
-
Return
|
|
453
|
-
------
|
|
454
|
-
int:
|
|
455
|
-
Valor del giroscopio en Z.
|
|
456
|
-
"""
|
|
457
|
-
|
|
458
|
-
return np.uint8(int(metadata[self.__GYROZf_pos[0]:self.__GYROZf_pos[1]+1],2))
|
|
459
|
-
|
|
460
|
-
def getACELX(self,metadata):
|
|
461
|
-
"""
|
|
462
|
-
Devuelve el valor del acelerómetro en X.
|
|
463
|
-
|
|
464
|
-
Parametros
|
|
465
|
-
----------
|
|
466
|
-
metadata: str
|
|
467
|
-
String con los metadatos obtenidos de la base de datos.
|
|
468
|
-
Return
|
|
469
|
-
------
|
|
470
|
-
int:
|
|
471
|
-
Valor del acelerómetro en X.
|
|
472
|
-
"""
|
|
473
|
-
|
|
474
|
-
return np.uint8(int(metadata[self.__ACELX_pos[0]:self.__ACELX_pos[1]+1],2))
|
|
475
|
-
|
|
476
|
-
def getACELY(self,metadata):
|
|
477
|
-
"""
|
|
478
|
-
Devuelve el valor del acelerómetro en Y.
|
|
479
|
-
|
|
480
|
-
Parametros
|
|
481
|
-
----------
|
|
482
|
-
metadata: str
|
|
483
|
-
String con los metadatos obtenidos de la base de datos.
|
|
484
|
-
Return
|
|
485
|
-
------
|
|
486
|
-
int:
|
|
487
|
-
Valor del acelerómetro en Y.
|
|
488
|
-
"""
|
|
489
|
-
|
|
490
|
-
return np.uint8(int(metadata[self.__ACELY_pos[0]:self.__ACELY_pos[1]+1],2))
|
|
491
|
-
|
|
492
|
-
def getACELZ(self,metadata):
|
|
493
|
-
"""
|
|
494
|
-
Devuelve el valor del acelerómetro en Z.
|
|
495
|
-
|
|
496
|
-
Parametros
|
|
497
|
-
----------
|
|
498
|
-
metadata: str
|
|
499
|
-
String con los metadatos obtenidos de la base de datos.
|
|
500
|
-
Return
|
|
501
|
-
------
|
|
502
|
-
int:
|
|
503
|
-
Valor del acelerómetro en Z.
|
|
504
|
-
"""
|
|
505
|
-
|
|
506
|
-
return np.uint8(int(metadata[self.__ACELZ_pos[0]:self.__ACELZ_pos[1]+1],2))
|
|
507
|
-
|
|
508
|
-
def getESTMOFlag(self, metadata):
|
|
509
|
-
"""
|
|
510
|
-
Devuelve el valor del flag de ESTMO
|
|
511
|
-
|
|
512
|
-
Parametros
|
|
513
|
-
----------
|
|
514
|
-
metadata: str
|
|
515
|
-
String con los metadatos obtenidos de la base de datos.
|
|
516
|
-
Return
|
|
517
|
-
------
|
|
518
|
-
int:
|
|
519
|
-
Valor del flag de ESTMO
|
|
520
|
-
"""
|
|
521
|
-
|
|
522
|
-
return np.uint8(int(metadata[self.__ESTMOflag_pos[0]:self.__ESTMOflag_pos[1]+1],2))
|
|
523
|
-
|
|
524
|
-
def getESTORFlag(self, metadata):
|
|
525
|
-
"""
|
|
526
|
-
Devuelve el valor del flag de ESTOR
|
|
527
|
-
|
|
528
|
-
Parametros
|
|
529
|
-
----------
|
|
530
|
-
metadata: str
|
|
531
|
-
String con los metadatos obtenidos de la base de datos.
|
|
532
|
-
Return
|
|
533
|
-
------
|
|
534
|
-
int:
|
|
535
|
-
Valor del flag de ESTOR
|
|
536
|
-
"""
|
|
537
|
-
|
|
538
|
-
return np.uint8(int(metadata[self.__ESTORflag_pos[0]:self.__ESTORflag_pos[1]+1],2))
|
|
539
|
-
|
|
540
|
-
def getSBAT(self, metadata):
|
|
541
|
-
"""
|
|
542
|
-
Devuelve el valor del estado de salud de la batería
|
|
543
|
-
|
|
544
|
-
Parametros
|
|
545
|
-
----------
|
|
546
|
-
metadata: str
|
|
547
|
-
String con los metadatos obtenidos de la base de datos.
|
|
548
|
-
Return
|
|
549
|
-
------
|
|
550
|
-
int:
|
|
551
|
-
Valor del flag de SBAT
|
|
552
|
-
"""
|
|
553
|
-
|
|
554
|
-
return np.uint8(int(metadata[self.__SBAT_pos[0]:self.__SBAT_pos[1]+1],2))
|
|
555
|
-
|
|
556
|
-
def getVBAT(self, metadata):
|
|
557
|
-
"""
|
|
558
|
-
Devuelve el valor del voltaje de la batería
|
|
559
|
-
|
|
560
|
-
Parametros
|
|
561
|
-
----------
|
|
562
|
-
metadata: str
|
|
563
|
-
String con los metadatos obtenidos de la base de datos.
|
|
564
|
-
Return
|
|
565
|
-
------
|
|
566
|
-
|
|
567
|
-
int:
|
|
568
|
-
Valor del flag de VBAT
|
|
569
|
-
"""
|
|
570
|
-
|
|
571
|
-
return np.uint8(int(metadata[self.__VBAT_pos[0]:self.__VBAT_pos[1]+1],2))
|
|
572
|
-
|
|
573
|
-
def getCBAT(self, metadata):
|
|
574
|
-
"""
|
|
575
|
-
Devuelve el valor del consumo de la batería
|
|
576
|
-
|
|
577
|
-
Parametros
|
|
578
|
-
----------
|
|
579
|
-
metadata: str
|
|
580
|
-
String con los metadatos obtenidos de la base de datos.
|
|
581
|
-
Return
|
|
582
|
-
------
|
|
583
|
-
|
|
584
|
-
int:
|
|
585
|
-
Valor del flag de CBAT
|
|
586
|
-
"""
|
|
587
|
-
|
|
588
|
-
return np.uint8(int(metadata[self.__CBAT_pos[0]:self.__CBAT_pos[1]+1],2))
|
|
589
|
-
|
|
590
|
-
def getESTBMSFlag(self, metadata):
|
|
591
|
-
"""
|
|
592
|
-
Devuelve el valor del flag de ESTBMS
|
|
593
|
-
|
|
594
|
-
Parametros
|
|
595
|
-
----------
|
|
596
|
-
metadata: str
|
|
597
|
-
String con los metadatos obtenidos de la base de datos.
|
|
598
|
-
Return
|
|
599
|
-
------
|
|
600
|
-
|
|
601
|
-
int:
|
|
602
|
-
Valor del flag de ESTBMS
|
|
603
|
-
"""
|
|
604
|
-
|
|
605
|
-
return np.uint8(int(metadata[self.__ESTBMSflag_pos[0]:self.__ESTBMSflag_pos[1]+1],2))
|
|
606
|
-
|
|
607
|
-
def getFIX(self, metadata):
|
|
608
|
-
"""
|
|
609
|
-
Devuelve el valor del flag de FIX
|
|
610
|
-
|
|
611
|
-
Parametros
|
|
612
|
-
----------
|
|
613
|
-
metadata: str
|
|
614
|
-
String con los metadatos obtenidos de la base de datos.
|
|
615
|
-
Return
|
|
616
|
-
------
|
|
617
|
-
|
|
618
|
-
int:
|
|
619
|
-
Valor del flag de FIX
|
|
620
|
-
"""
|
|
621
|
-
|
|
622
|
-
return np.uint8(int(metadata[self.__FIX_pos[0]:self.__FIX_pos[1]+1],2))
|
|
623
|
-
|
|
624
|
-
def getSIV(self, metadata):
|
|
625
|
-
"""
|
|
626
|
-
Devuelve el valor del flag de SIV
|
|
627
|
-
|
|
628
|
-
Parametros
|
|
629
|
-
----------
|
|
630
|
-
metadata: str
|
|
631
|
-
String con los metadatos obtenidos de la base de datos.
|
|
632
|
-
Return
|
|
633
|
-
------
|
|
634
|
-
|
|
635
|
-
int:
|
|
636
|
-
Valor del flag de SIV
|
|
637
|
-
"""
|
|
638
|
-
|
|
639
|
-
return np.uint8(int(metadata[self.__SIV_pos[0]:self.__SIV_pos[1]+1],2))
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
@property
|
|
643
|
-
def RFFlag(self):
|
|
644
|
-
return self._RFFlag
|
|
645
|
-
|
|
646
|
-
@property
|
|
647
|
-
def GNSSFlag(self):
|
|
648
|
-
return self._GNSSFlag
|
|
649
|
-
|
|
650
|
-
@property
|
|
651
|
-
def RFIDFlag(self):
|
|
652
|
-
return self._RFIDFlag
|
|
653
|
-
|
|
654
|
-
@property
|
|
655
|
-
def FLASHFlag(self):
|
|
656
|
-
return self._FLASHFlag
|
|
657
|
-
|
|
658
|
-
@property
|
|
659
|
-
def RTCSFlag(self):
|
|
660
|
-
return self._RTCSFlag
|
|
661
|
-
|
|
662
|
-
@property
|
|
663
|
-
def MODEFlag(self):
|
|
664
|
-
return self._MODEFlag
|
|
665
|
-
|
|
666
|
-
@property
|
|
667
|
-
def NBAT(self):
|
|
668
|
-
return self._NBAT
|
|
669
|
-
|
|
670
|
-
@property
|
|
671
|
-
def TIMEAC(self):
|
|
672
|
-
return self._TIMEAC
|
|
673
|
-
|
|
674
|
-
@property
|
|
675
|
-
def ESTAC(self):
|
|
676
|
-
return self._ESTAC
|
|
677
|
-
|
|
678
|
-
@property
|
|
679
|
-
def DSTRPT(self):
|
|
680
|
-
return self._DSTRPT
|
|
681
|
-
|
|
682
|
-
@property
|
|
683
|
-
def INESTPT(self):
|
|
684
|
-
return self._INESTPT
|
|
685
|
-
|
|
686
|
-
@property
|
|
687
|
-
def OFFSPT(self):
|
|
688
|
-
return self._OFFSPT
|
|
689
|
-
|
|
690
|
-
@property
|
|
691
|
-
def DSTRFT(self):
|
|
692
|
-
return self._DSTRFT
|
|
693
|
-
|
|
694
|
-
@property
|
|
695
|
-
def INESTFT(self):
|
|
696
|
-
return self._INESTFT
|
|
697
|
-
|
|
698
|
-
@property
|
|
699
|
-
def OFFSFT(self):
|
|
700
|
-
return self._OFFSFT
|
|
701
|
-
|
|
702
|
-
@property
|
|
703
|
-
def PMSTFlag(self):
|
|
704
|
-
return self._PMSTFlag
|
|
705
|
-
|
|
706
|
-
@property
|
|
707
|
-
def GYROX(self):
|
|
708
|
-
return self._GYROX
|
|
709
|
-
|
|
710
|
-
@property
|
|
711
|
-
def GYROY(self):
|
|
712
|
-
return self._GYROY
|
|
713
|
-
|
|
714
|
-
@property
|
|
715
|
-
def GYROZ(self):
|
|
716
|
-
return self._GYROZ
|
|
717
|
-
|
|
718
|
-
@property
|
|
719
|
-
def ACELX(self):
|
|
720
|
-
return self._ACELX
|
|
721
|
-
|
|
722
|
-
@property
|
|
723
|
-
def ACELY(self):
|
|
724
|
-
return self._ACELY
|
|
725
|
-
|
|
726
|
-
@property
|
|
727
|
-
def ACELZ(self):
|
|
728
|
-
return self._ACELZ
|
|
729
|
-
|
|
730
|
-
@property
|
|
731
|
-
def ESTMOFlag(self):
|
|
732
|
-
return self._ESTMOFlag
|
|
733
|
-
|
|
734
|
-
@property
|
|
735
|
-
def ESTORFlag(self):
|
|
736
|
-
return self._ESTORFlag
|
|
737
|
-
|
|
738
|
-
@property
|
|
739
|
-
def SBAT(self):
|
|
740
|
-
return self._SBAT
|
|
741
|
-
|
|
742
|
-
@property
|
|
743
|
-
def VBAT(self):
|
|
744
|
-
return self._VBAT
|
|
745
|
-
|
|
746
|
-
@property
|
|
747
|
-
def CBAT(self):
|
|
748
|
-
return self._CBAT
|
|
749
|
-
|
|
750
|
-
@property
|
|
751
|
-
def ESTBMSFlag(self):
|
|
752
|
-
return self._ESTBMSFlag
|
|
753
|
-
|
|
754
|
-
@property
|
|
755
|
-
def FIX(self):
|
|
756
|
-
return self._FIX
|
|
757
|
-
|
|
758
|
-
@property
|
|
759
|
-
def SIV(self):
|
|
760
|
-
return self._SIV
|
|
761
|
-
|
|
762
|
-
@property
|
|
763
|
-
def dataPositions(self):
|
|
764
|
-
return self._dataPositions
|
|
27
|
+
Los datos se retornan como un array de numpy, donde cada fila es una operación y cada columna es un sensor.
|
|
28
|
+
Es decir, los datos son de la forma (n_operaciones, n_columnas).
|
|
29
|
+
"""
|
|
30
|
+
return self.data.values
|
|
31
|
+
|
|
32
|
+
def __getitem__(self, key):
|
|
33
|
+
"""
|
|
34
|
+
Permite indexar el objeto como un array o DataFrame.
|
|
35
|
+
|
|
36
|
+
Ejemplos:
|
|
37
|
+
obj[["col1", "col2"], :] -> columnas col1 y col2, todas las filas
|
|
38
|
+
obj[:, :100] -> todas las columnas, primeras 100 filas
|
|
39
|
+
obj[:] -> todo
|
|
40
|
+
obj[["col1"], :50] -> columna col1, primeras 50 filas
|
|
41
|
+
"""
|
|
42
|
+
if isinstance(key, tuple): ##reviso si es una tupla
|
|
43
|
+
##se supone que key es una tupla de la forma (cols, rows)
|
|
44
|
+
if len(key) != 2:
|
|
45
|
+
raise ValueError("La clave debe ser una tupla de la forma (cols, rows)")
|
|
46
|
+
cols, rows = key
|
|
47
|
+
|
|
48
|
+
# Columnas
|
|
49
|
+
if isinstance(cols, list) or isinstance(cols, str):
|
|
50
|
+
selected_cols = cols
|
|
51
|
+
elif cols == slice(None): # equivalente a ":"
|
|
52
|
+
selected_cols = self.data.columns
|
|
53
|
+
else:
|
|
54
|
+
raise TypeError(f"Tipo de indexado de columnas no soportado: {type(cols)}")
|
|
55
|
+
|
|
56
|
+
# Filas
|
|
57
|
+
if isinstance(rows, int) or isinstance(rows, slice):
|
|
58
|
+
#retornamos de la forma (n_operaciones, n_columnas)
|
|
59
|
+
return self.data.loc[rows, selected_cols].values
|
|
60
|
+
else:
|
|
61
|
+
raise TypeError(f"Tipo de indexado de filas no soportado: {type(rows)}")
|
|
62
|
+
|
|
63
|
+
elif isinstance(key, slice):
|
|
64
|
+
# Caso para todas las filas y columnas
|
|
65
|
+
# Retornamos de la forma (n_operaciones, n_columnas)
|
|
66
|
+
return self.data.iloc[key].values
|
|
67
|
+
|
|
68
|
+
else:
|
|
69
|
+
raise TypeError("La indexación debe ser una tupla (cols, rows) o un slice ':'")
|
|
765
70
|
|
|
766
71
|
if __name__ == "__main__":
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
"1010001000010000110000001011000000000000000000001111011010001001"])
|
|
72
|
+
import pandas as pd
|
|
73
|
+
import json
|
|
74
|
+
from sarapy.preprocessing import TransformInputData
|
|
771
75
|
|
|
772
|
-
|
|
76
|
+
historical_data_path = "examples/2025-06-21/UPM000N/historical-data.json"
|
|
77
|
+
with open(historical_data_path, 'r') as file:
|
|
78
|
+
historical_data = json.load(file)
|
|
773
79
|
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
print(tlmsde.dataPositions)
|
|
777
|
-
print(tlmsde.dataPositions["TIMEAC"])
|
|
778
|
-
print(data_transformed)
|
|
779
|
-
print(data_transformed.shape)
|
|
80
|
+
inputData_transformer = TransformInputData.TransformInputData()
|
|
81
|
+
data = inputData_transformer.transform(historical_data)
|
|
780
82
|
|
|
781
|
-
|
|
83
|
+
tlm_processor = TLMSensorDataProcessor(data=data)
|
|
84
|
+
print(tlm_processor.data.head())
|
|
85
|
+
tlm_processor[:, :10].shape
|
|
86
|
+
|
|
87
|
+
tlm_processor[["id_db_dw", "id_db_h"], :5]#.shape
|
|
88
|
+
tlm_processor.keys
|
|
89
|
+
tlm_processor["longitud",:]
|
|
90
|
+
|