sarapy 0.1.4__tar.gz → 0.2.1__tar.gz
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-0.1.4 → sarapy-0.2.1}/PKG-INFO +11 -1
- {sarapy-0.1.4 → sarapy-0.2.1}/README.md +10 -0
- {sarapy-0.1.4 → sarapy-0.2.1}/pyproject.toml +1 -1
- sarapy-0.2.1/sarapy/dataProcessing/GeoAnalyzer.py +116 -0
- {sarapy-0.1.4 → sarapy-0.2.1}/sarapy/dataProcessing/TLMSensorDataExtractor.py +180 -126
- sarapy-0.2.1/sarapy/dataProcessing/TimeSeriesProcessor.py +105 -0
- sarapy-0.2.1/sarapy/dataProcessing/__init__.py +3 -0
- {sarapy-0.1.4 → sarapy-0.2.1}/sarapy/version.py +1 -1
- {sarapy-0.1.4 → sarapy-0.2.1}/sarapy.egg-info/PKG-INFO +11 -1
- {sarapy-0.1.4 → sarapy-0.2.1}/sarapy.egg-info/SOURCES.txt +2 -0
- sarapy-0.1.4/sarapy/dataProcessing/__init__.py +0 -1
- {sarapy-0.1.4 → sarapy-0.2.1}/sarapy/__init__.py +0 -0
- {sarapy-0.1.4 → sarapy-0.2.1}/sarapy.egg-info/dependency_links.txt +0 -0
- {sarapy-0.1.4 → sarapy-0.2.1}/sarapy.egg-info/requires.txt +0 -0
- {sarapy-0.1.4 → sarapy-0.2.1}/sarapy.egg-info/top_level.txt +0 -0
- {sarapy-0.1.4 → sarapy-0.2.1}/setup.cfg +0 -0
- {sarapy-0.1.4 → sarapy-0.2.1}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: sarapy
|
|
3
|
-
Version: 0.1
|
|
3
|
+
Version: 0.2.1
|
|
4
4
|
Summary: Library for Sarapico Metadata processing
|
|
5
5
|
Home-page: https://github.com/lucasbaldezzari/sarapy
|
|
6
6
|
Author: Lucas Baldezzari
|
|
@@ -24,6 +24,16 @@ Requires-Dist: geopy
|
|
|
24
24
|
|
|
25
25
|
Library for processing SARAPICO project metadata of _AMG_.
|
|
26
26
|
|
|
27
|
+
#### Version 0.2.1
|
|
28
|
+
|
|
29
|
+
- Se corrige _init.py_ de dataProcessing.
|
|
30
|
+
|
|
31
|
+
#### Version 0.2.0
|
|
32
|
+
|
|
33
|
+
- Transforming some attributs to private attributes. Adding @property for getters.
|
|
34
|
+
- Created GNSSDataProcessor class.
|
|
35
|
+
- Created TimeSeriesProcessor class.
|
|
36
|
+
|
|
27
37
|
#### Version 0.1.4
|
|
28
38
|
|
|
29
39
|
Setting an **init**.py file for TLMSensorDataExtractor module.
|
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
Library for processing SARAPICO project metadata of _AMG_.
|
|
4
4
|
|
|
5
|
+
#### Version 0.2.1
|
|
6
|
+
|
|
7
|
+
- Se corrige _init.py_ de dataProcessing.
|
|
8
|
+
|
|
9
|
+
#### Version 0.2.0
|
|
10
|
+
|
|
11
|
+
- Transforming some attributs to private attributes. Adding @property for getters.
|
|
12
|
+
- Created GNSSDataProcessor class.
|
|
13
|
+
- Created TimeSeriesProcessor class.
|
|
14
|
+
|
|
5
15
|
#### Version 0.1.4
|
|
6
16
|
|
|
7
17
|
Setting an **init**.py file for TLMSensorDataExtractor module.
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
###Documentación en https://github.com/lucasbaldezzari/sarapy/blob/main/docs/Readme.md
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
from geopy.distance import geodesic
|
|
5
|
+
from sklearn.base import BaseEstimator, TransformerMixin
|
|
6
|
+
import warnings
|
|
7
|
+
|
|
8
|
+
class GeoAnalyzer(BaseEstimator, TransformerMixin):
|
|
9
|
+
"""La clase GeoAnalyzer se encarga de gestionar los datos de georreferenciación."""
|
|
10
|
+
|
|
11
|
+
# _GeoPoint = Tuple[float, float]
|
|
12
|
+
|
|
13
|
+
def __init__(self):
|
|
14
|
+
"""Inicializa la clase GeoAnalyzer."""
|
|
15
|
+
|
|
16
|
+
self._points = None #np.array de tuplas con las coordenadas de latitud y longitud
|
|
17
|
+
self.is_fitted = False
|
|
18
|
+
|
|
19
|
+
@staticmethod
|
|
20
|
+
def getDistance(point1: np.array, point2: np.array) ->float:
|
|
21
|
+
"""Calcula la distancia elipsoidal (en metros) entre los puntos p1 y p2 donde cada punto está representado como un array con un valor de latitud y otro de longitud.
|
|
22
|
+
|
|
23
|
+
Parametros
|
|
24
|
+
p1 (tuple): np.array de tuplas con las coordenadas de latitud y longitud del punto 1
|
|
25
|
+
p2 (tuple): np.array de tuplas con las coordenadas de latitud y longitud del punto 2
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
float: np.array con las distancias entre los dos puntos
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
##aplicamos la función geodesic
|
|
32
|
+
return geodesic(point1, point2).meters
|
|
33
|
+
|
|
34
|
+
def fit(self, X: np.array, y=None)-> np.array:
|
|
35
|
+
"""fittea el objeto
|
|
36
|
+
|
|
37
|
+
- X: array con los puntos de latitud y longitud. Shape (n, 2)
|
|
38
|
+
"""
|
|
39
|
+
##asserteamos que X sea un np.array
|
|
40
|
+
assert isinstance(X, np.ndarray), "X debe ser un np.array"
|
|
41
|
+
##asserteamos que X tenga dos columnas
|
|
42
|
+
assert X.ndim == 2, "X debe ser de la forma (n, 2)"
|
|
43
|
+
##asserteamos que X no tenga valores nulos
|
|
44
|
+
assert not np.isnan(X).any(), "X no debe tener valores nulos"
|
|
45
|
+
##chequeamos que X tenga una sola fila, si es así, enviamos un warning y agregamos una fila copiando la única fila que tiene
|
|
46
|
+
if X.shape[0] == 1:
|
|
47
|
+
warnings.warn("X tiene una sola fila, se agregará una fila copiando la única fila que tiene")
|
|
48
|
+
X = np.vstack((X, X))
|
|
49
|
+
|
|
50
|
+
self._points = X
|
|
51
|
+
self.is_fitted = True
|
|
52
|
+
|
|
53
|
+
def transform(self, X, y=None):
|
|
54
|
+
"""Transforma los datos de X en distancias entre los puntos.
|
|
55
|
+
|
|
56
|
+
- X: array con los puntos de latitud y longitud. Shape (n, 2)-
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
np.array: np.array con las distancias entre los dos puntos
|
|
60
|
+
"""
|
|
61
|
+
if not self.is_fitted:
|
|
62
|
+
raise RuntimeError("El modelo no ha sido fitteado.")
|
|
63
|
+
|
|
64
|
+
##calculamos la distancia entre los puntos de latitud y longitud dentro de X
|
|
65
|
+
self._distances = np.array([self.getDistance(point1, point2) for point1, point2 in zip(self.points,self.points[1:])]).round(2)
|
|
66
|
+
|
|
67
|
+
return self._distances
|
|
68
|
+
|
|
69
|
+
def fit_transform(self, X, y=None):
|
|
70
|
+
"""Fit y transforma los datos de X en distancias entre los puntos.
|
|
71
|
+
|
|
72
|
+
- X: datos de entrenamiento
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
np.array: np.array con las distancias entre los dos puntos
|
|
76
|
+
"""
|
|
77
|
+
self.fit(X)
|
|
78
|
+
return self.transform(self.points)
|
|
79
|
+
|
|
80
|
+
@property
|
|
81
|
+
def points(self):
|
|
82
|
+
"""Devuelve los puntos de georreferenciación."""
|
|
83
|
+
return self._points
|
|
84
|
+
|
|
85
|
+
@property
|
|
86
|
+
def distances(self):
|
|
87
|
+
"""Devuelve las distancias entre los puntos."""
|
|
88
|
+
##chqueamos que el modelo haya sido fitteado
|
|
89
|
+
if not self.is_fitted:
|
|
90
|
+
warnings.warn("El modelo no ha sido fitteado.")
|
|
91
|
+
return None
|
|
92
|
+
else:
|
|
93
|
+
return self._distances
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
if __name__ == "__main__":
|
|
97
|
+
ga = GeoAnalyzer()
|
|
98
|
+
|
|
99
|
+
puntos = np.array([[-32.329910, -57.229061],
|
|
100
|
+
[ -32.329895, -57.229061],
|
|
101
|
+
[-32.329880, -57.229069],
|
|
102
|
+
[-32.329865, -57.229069]])
|
|
103
|
+
|
|
104
|
+
ga.fit(puntos)
|
|
105
|
+
print(ga.transform(puntos))
|
|
106
|
+
print(ga.fit_transform(puntos))
|
|
107
|
+
print(ga.distances)
|
|
108
|
+
punto_referencia = puntos[0]
|
|
109
|
+
|
|
110
|
+
sample = np.array([[-32.329910, -57.229061]])
|
|
111
|
+
|
|
112
|
+
ga2 = GeoAnalyzer()
|
|
113
|
+
ga2.fit(sample)
|
|
114
|
+
ga2.points
|
|
115
|
+
print(ga2.fit_transform(sample))
|
|
116
|
+
print(ga2.distances)
|
|
@@ -1,44 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
La clase MetadataManager se encarga de gestionar los metadatos obtenidos de la base de datos. Estos metadatos se corresponden con los datos registrados en los sarapicos.
|
|
1
|
+
###Documentación en https://github.com/lucasbaldezzari/sarapy/blob/main/docs/Readme.md
|
|
3
2
|
|
|
4
|
-
- Versión de metadatos utilizada: Revision 9
|
|
5
|
-
- Apuntes de identificiación: https://docs.google.com/document/d/1E-TvkMWqeL9d57FOeRH7Zk_Fr5SdmknnmuQ7n7uwUVg/edit#heading=h.3dy6vkm
|
|
6
|
-
- Apuntes de
|
|
7
|
-
- Apuntes de Desarrollo:
|
|
8
|
-
|
|
9
|
-
- Autor: BALDEZZARI Lucas
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
##importamos numpy
|
|
13
3
|
import numpy as np
|
|
14
|
-
# from geopy.distance import geodesic
|
|
15
|
-
|
|
16
4
|
from sklearn.base import BaseEstimator, TransformerMixin
|
|
17
5
|
|
|
18
6
|
class TLMSensorDataExtractor(BaseEstimator, TransformerMixin):
|
|
19
|
-
"""
|
|
20
|
-
Clase que se encarga de procesar los metadatos obtenidos de la base de datos histórica.
|
|
21
|
-
|
|
22
|
-
- Versión de metadatos utilizada: Revision 9
|
|
23
|
-
- Link documento metadato: https://trello.com/c/M6DWjpwr/70-definici%C3%B3n-metadatos-a-relevar
|
|
24
|
-
- Los metadatos de DATA_TLM en la Revisión 9 vienen en un string de 0 y 1. Estos valores indican, lo siguiente:
|
|
25
|
-
|RF(1bit)|GNSS(1bit)|RFID(1bit)|FLASH(1bit)|RTCS(1bit)|MODE(1bit)|NBAT(2bits)|TIMEAC(8bits)|ESTAC(1bit)|DSTR PT(4bits)|INEST PT(1bit)|OFFS PT(2bits)|X(1bit)|DSTR FT(4bits)|INEST FT(1bit)|OFFS FT(2bits)|X(1bit)|GYRO_X(3bits)|GYRO_Y(3bits)|GYRO_Z(2bits)|ACEL_X(2bits)|ACEL_Y(2bits)|ACEL_Z(2bits)|EST MO(1bit)|EST OR(1bit)|SBAT(2bits)|VBAT(3bits)|CBAT(2bits)|EST BMS(1bit)
|
|
26
|
-
|
|
27
|
-
Los valores X indican bit sin uso.
|
|
28
|
-
|
|
29
|
-
- Versión 1.0.0.RevA
|
|
30
|
-
- Autor: BALDEZZARI Lucas
|
|
31
|
-
"""
|
|
7
|
+
"""- Autor: BALDEZZARI Lucas"""
|
|
32
8
|
|
|
33
9
|
__metadataVersion = "Revision 9" #Versión de metadatos utilizada
|
|
34
10
|
|
|
35
11
|
def __init__(self, *args, **kwargs):
|
|
36
|
-
"""
|
|
37
|
-
Constructor de la clase MetadataManager.
|
|
38
|
-
|
|
39
|
-
:param metadata: Diccionario con los metadatos obtenidos de la base de datos.
|
|
40
|
-
:type metadata: strg
|
|
41
|
-
"""
|
|
12
|
+
"""Constructor de la clase MetadataManager."""
|
|
42
13
|
|
|
43
14
|
### Creamos constantes que sirven para buscar los datos en el string de telemetría
|
|
44
15
|
### Cada constante es una tupla con la posición del bit menos significativo y la posición del bit más significativo
|
|
@@ -75,113 +46,82 @@ class TLMSensorDataExtractor(BaseEstimator, TransformerMixin):
|
|
|
75
46
|
self.is_fitted = False
|
|
76
47
|
|
|
77
48
|
def fit(self, X, y=None):
|
|
78
|
-
"""
|
|
79
|
-
Método para generar datos a partir de la metadata.
|
|
80
|
-
|
|
81
|
-
X es un array de strings. Cada string es un dato de la metadata.
|
|
82
|
-
|
|
83
|
-
Extraigo información de cada fila de X. Genero numpys array de cada dato extraido de la metadata.
|
|
84
|
-
|
|
85
|
-
Parametros
|
|
86
|
-
----------
|
|
87
|
-
X: Array de strings.
|
|
88
|
-
y: None
|
|
89
|
-
No se utiliza.
|
|
90
|
-
"""
|
|
49
|
+
"""Método para generar datos a partir de la metadata."""
|
|
91
50
|
|
|
92
51
|
##chequeamos si todos los strings de X tienen la misma longitud, sino arrojamos un assert
|
|
93
52
|
assert all(len(x) == len(X[0]) for x in X), "Todos los strings de X deben tener la misma longitud"
|
|
94
53
|
|
|
95
|
-
self.
|
|
96
|
-
self.
|
|
97
|
-
self.
|
|
98
|
-
self.
|
|
99
|
-
self.
|
|
100
|
-
self.
|
|
101
|
-
self.
|
|
102
|
-
self.
|
|
103
|
-
self.
|
|
104
|
-
self.
|
|
105
|
-
self.
|
|
106
|
-
self.
|
|
107
|
-
self.
|
|
108
|
-
self.
|
|
109
|
-
self.
|
|
110
|
-
self.
|
|
111
|
-
self.
|
|
112
|
-
self.
|
|
113
|
-
self.
|
|
114
|
-
self.
|
|
115
|
-
self.
|
|
116
|
-
self.
|
|
117
|
-
self.
|
|
118
|
-
self.
|
|
119
|
-
self.
|
|
120
|
-
self.
|
|
121
|
-
self.
|
|
122
|
-
self.
|
|
54
|
+
self._RFFlag = np.vectorize(self.getRFFlag)(X)
|
|
55
|
+
self._GNSSFlag = np.vectorize(self.getGNSSFlag)(X)
|
|
56
|
+
self._RFIDFlag = np.vectorize(self.getRFIDFlag)(X)
|
|
57
|
+
self._FLASHFlag = np.vectorize(self.getFLASHFlag)(X)
|
|
58
|
+
self._RTCSFlag = np.vectorize(self.getRTCSFlag)(X)
|
|
59
|
+
self._MODEFlag = np.vectorize(self.getMODEFlag)(X)
|
|
60
|
+
self._NBAT = np.vectorize(self.getNBAT)(X)
|
|
61
|
+
self._TIMEAC = np.vectorize(self.getTIMEAC)(X)
|
|
62
|
+
self._ESTAC = np.vectorize(self.getESTAC)(X)
|
|
63
|
+
self._DSTRPT = np.vectorize(self.getDSTRPT)(X)
|
|
64
|
+
self._INESTPT = np.vectorize(self.getINESTPTFlag)(X)
|
|
65
|
+
self._OFFSPT = np.vectorize(self.getOFFSPT)(X)
|
|
66
|
+
self._DSTRFT = np.vectorize(self.getDSTRFT)(X)
|
|
67
|
+
self._INESTFT = np.vectorize(self.getINESTFTFlag)(X)
|
|
68
|
+
self._OFFSFT = np.vectorize(self.getOFFSFT)(X)
|
|
69
|
+
self._PMSTFlag = np.vectorize(self.getPMSTFlag)(X)
|
|
70
|
+
self._GYROX = np.vectorize(self.getGYROX)(X)
|
|
71
|
+
self._GYROY = np.vectorize(self.getGYROY)(X)
|
|
72
|
+
self._GYROZ = np.vectorize(self.getGYROZ)(X)
|
|
73
|
+
self._ACELX = np.vectorize(self.getACELX)(X)
|
|
74
|
+
self._ACELY = np.vectorize(self.getACELY)(X)
|
|
75
|
+
self._ACELZ = np.vectorize(self.getACELZ)(X)
|
|
76
|
+
self._ESTMOFlag = np.vectorize(self.getESTMOFlag)(X)
|
|
77
|
+
self._ESTORFlag = np.vectorize(self.getESTORFlag)(X)
|
|
78
|
+
self._SBAT = np.vectorize(self.getSBAT)(X)
|
|
79
|
+
self._VBAT = np.vectorize(self.getVBAT)(X)
|
|
80
|
+
self._CBAT = np.vectorize(self.getCBAT)(X)
|
|
81
|
+
self._ESTBMSFlag = np.vectorize(self.getESTBMSFlag)(X)
|
|
123
82
|
|
|
124
83
|
self.is_fitted = True
|
|
125
|
-
|
|
84
|
+
|
|
126
85
|
|
|
127
86
|
def transform(self, X, y=None):
|
|
128
|
-
"""
|
|
129
|
-
|
|
130
|
-
Forma una matriz de numpy.
|
|
131
|
-
|
|
132
|
-
Parametros
|
|
133
|
-
----------
|
|
134
|
-
X: X es un array de strings. Cada string es un dato de la metadata.
|
|
135
|
-
y: None
|
|
136
|
-
No se utiliza."""
|
|
87
|
+
"""
|
|
88
|
+
"""
|
|
137
89
|
|
|
138
90
|
##chequeamos si se ha llamado a fit(). Sino, se arroja un error
|
|
139
91
|
if not self.is_fitted:
|
|
140
92
|
raise ValueError("MetadataManager no ha sido fitteado. Llame a fit() previamente.")
|
|
141
93
|
|
|
142
|
-
return np.array([ self.
|
|
143
|
-
self.
|
|
144
|
-
self.
|
|
145
|
-
self.
|
|
146
|
-
self.
|
|
147
|
-
self.
|
|
148
|
-
self.
|
|
149
|
-
self.
|
|
150
|
-
self.
|
|
151
|
-
self.
|
|
152
|
-
self.
|
|
153
|
-
self.
|
|
154
|
-
self.
|
|
155
|
-
self.
|
|
156
|
-
self.
|
|
157
|
-
self.
|
|
158
|
-
self.
|
|
159
|
-
self.
|
|
160
|
-
self.
|
|
161
|
-
self.
|
|
162
|
-
self.
|
|
163
|
-
self.
|
|
164
|
-
self.
|
|
165
|
-
self.
|
|
166
|
-
self.
|
|
167
|
-
self.
|
|
168
|
-
self.
|
|
169
|
-
self.
|
|
94
|
+
return np.array([ self._RFFlag,
|
|
95
|
+
self._GNSSFlag,
|
|
96
|
+
self._RFIDFlag,
|
|
97
|
+
self._FLASHFlag,
|
|
98
|
+
self._RTCSFlag,
|
|
99
|
+
self._MODEFlag,
|
|
100
|
+
self._NBAT,
|
|
101
|
+
self._TIMEAC,
|
|
102
|
+
self._ESTAC,
|
|
103
|
+
self._DSTRPT,
|
|
104
|
+
self._INESTPT,
|
|
105
|
+
self._OFFSPT,
|
|
106
|
+
self._DSTRFT,
|
|
107
|
+
self._INESTFT,
|
|
108
|
+
self._OFFSFT,
|
|
109
|
+
self._PMSTFlag,
|
|
110
|
+
self._GYROX,
|
|
111
|
+
self._GYROY,
|
|
112
|
+
self._GYROZ,
|
|
113
|
+
self._ACELX,
|
|
114
|
+
self._ACELY,
|
|
115
|
+
self._ACELZ,
|
|
116
|
+
self._ESTMOFlag,
|
|
117
|
+
self._ESTORFlag,
|
|
118
|
+
self._SBAT,
|
|
119
|
+
self._VBAT,
|
|
120
|
+
self._CBAT,
|
|
121
|
+
self._ESTBMSFlag]).T
|
|
170
122
|
|
|
171
123
|
def fit_transform(self, X, y=None):
|
|
172
|
-
"""Combinamos fit() y transform() en un solo método.
|
|
173
|
-
|
|
174
|
-
Parametros
|
|
175
|
-
----------
|
|
176
|
-
X: X es un array de strings. Cada string es un dato de la metadata.
|
|
177
|
-
y: None
|
|
178
|
-
No se utiliza.
|
|
179
|
-
|
|
180
|
-
Return
|
|
181
|
-
------
|
|
182
|
-
numpy array:
|
|
183
|
-
Array de numpy con los datos extraidos de la metadata.
|
|
184
|
-
"""
|
|
124
|
+
"""Combinamos fit() y transform() en un solo método."""
|
|
185
125
|
self.fit(X)
|
|
186
126
|
return self.transform(X)
|
|
187
127
|
|
|
@@ -638,6 +578,118 @@ class TLMSensorDataExtractor(BaseEstimator, TransformerMixin):
|
|
|
638
578
|
return np.uint8(int(metadata[self.__ESTBMSflag_pos[0]:self.__ESTBMSflag_pos[1]+1],2))
|
|
639
579
|
|
|
640
580
|
|
|
581
|
+
@property
|
|
582
|
+
def RFFlag(self):
|
|
583
|
+
return self._RFFlag
|
|
584
|
+
|
|
585
|
+
@property
|
|
586
|
+
def GNSSFlag(self):
|
|
587
|
+
return self._GNSSFlag
|
|
588
|
+
|
|
589
|
+
@property
|
|
590
|
+
def RFIDFlag(self):
|
|
591
|
+
return self._RFIDFlag
|
|
592
|
+
|
|
593
|
+
@property
|
|
594
|
+
def FLASHFlag(self):
|
|
595
|
+
return self._FLASHFlag
|
|
596
|
+
|
|
597
|
+
@property
|
|
598
|
+
def RTCSFlag(self):
|
|
599
|
+
return self._RTCSFlag
|
|
600
|
+
|
|
601
|
+
@property
|
|
602
|
+
def MODEFlag(self):
|
|
603
|
+
return self._MODEFlag
|
|
604
|
+
|
|
605
|
+
@property
|
|
606
|
+
def NBAT(self):
|
|
607
|
+
return self._NBAT
|
|
608
|
+
|
|
609
|
+
@property
|
|
610
|
+
def TIMEAC(self):
|
|
611
|
+
return self._TIMEAC
|
|
612
|
+
|
|
613
|
+
@property
|
|
614
|
+
def ESTAC(self):
|
|
615
|
+
return self._ESTAC
|
|
616
|
+
|
|
617
|
+
@property
|
|
618
|
+
def DSTRPT(self):
|
|
619
|
+
return self._DSTRPT
|
|
620
|
+
|
|
621
|
+
@property
|
|
622
|
+
def INESTPT(self):
|
|
623
|
+
return self._INESTPT
|
|
624
|
+
|
|
625
|
+
@property
|
|
626
|
+
def OFFSPT(self):
|
|
627
|
+
return self._OFFSPT
|
|
628
|
+
|
|
629
|
+
@property
|
|
630
|
+
def DSTRFT(self):
|
|
631
|
+
return self._DSTRFT
|
|
632
|
+
|
|
633
|
+
@property
|
|
634
|
+
def INESTFT(self):
|
|
635
|
+
return self._INESTFT
|
|
636
|
+
|
|
637
|
+
@property
|
|
638
|
+
def OFFSFT(self):
|
|
639
|
+
return self._OFFSFT
|
|
640
|
+
|
|
641
|
+
@property
|
|
642
|
+
def PMSTFlag(self):
|
|
643
|
+
return self._PMSTFlag
|
|
644
|
+
|
|
645
|
+
@property
|
|
646
|
+
def GYROX(self):
|
|
647
|
+
return self._GYROX
|
|
648
|
+
|
|
649
|
+
@property
|
|
650
|
+
def GYROY(self):
|
|
651
|
+
return self._GYROY
|
|
652
|
+
|
|
653
|
+
@property
|
|
654
|
+
def GYROZ(self):
|
|
655
|
+
return self._GYROZ
|
|
656
|
+
|
|
657
|
+
@property
|
|
658
|
+
def ACELX(self):
|
|
659
|
+
return self._ACELX
|
|
660
|
+
|
|
661
|
+
@property
|
|
662
|
+
def ACELY(self):
|
|
663
|
+
return self._ACELY
|
|
664
|
+
|
|
665
|
+
@property
|
|
666
|
+
def ACELZ(self):
|
|
667
|
+
return self._ACELZ
|
|
668
|
+
|
|
669
|
+
@property
|
|
670
|
+
def ESTMOFlag(self):
|
|
671
|
+
return self._ESTMOFlag
|
|
672
|
+
|
|
673
|
+
@property
|
|
674
|
+
def ESTORFlag(self):
|
|
675
|
+
return self._ESTORFlag
|
|
676
|
+
|
|
677
|
+
@property
|
|
678
|
+
def SBAT(self):
|
|
679
|
+
return self._SBAT
|
|
680
|
+
|
|
681
|
+
@property
|
|
682
|
+
def VBAT(self):
|
|
683
|
+
return self._VBAT
|
|
684
|
+
|
|
685
|
+
@property
|
|
686
|
+
def CBAT(self):
|
|
687
|
+
return self._CBAT
|
|
688
|
+
|
|
689
|
+
@property
|
|
690
|
+
def ESTBMSFlag(self):
|
|
691
|
+
return self._ESTBMSFlag
|
|
692
|
+
|
|
641
693
|
@classmethod
|
|
642
694
|
def getMetadataRevisionNumber(cls):
|
|
643
695
|
"""
|
|
@@ -652,7 +704,7 @@ class TLMSensorDataExtractor(BaseEstimator, TransformerMixin):
|
|
|
652
704
|
|
|
653
705
|
if __name__ == "__main__":
|
|
654
706
|
tlmsde = TLMSensorDataExtractor()
|
|
655
|
-
print(tlmsde.getMetadataRevisionNumber())
|
|
707
|
+
print(tlmsde.getMetadataRevisionNumber())
|
|
656
708
|
|
|
657
709
|
sample = np.array(["1010001000010000110000001011000000000000000000001111011010001001",
|
|
658
710
|
"1010001000010000110000001011000000000000000000001111011010001001"])
|
|
@@ -660,4 +712,6 @@ if __name__ == "__main__":
|
|
|
660
712
|
tlmsde.getTIMEAC(sample[0])
|
|
661
713
|
|
|
662
714
|
# tlmsde.fit(sample)
|
|
663
|
-
print(tlmsde.fit_transform(sample))
|
|
715
|
+
print(tlmsde.fit_transform(sample))
|
|
716
|
+
|
|
717
|
+
print(tlmsde.TIMEAC)
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
###Documentación en https://github.com/lucasbaldezzari/sarapy/blob/main/docs/Readme.md
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
from sklearn.base import BaseEstimator, TransformerMixin
|
|
5
|
+
import warnings
|
|
6
|
+
from datetime import datetime
|
|
7
|
+
|
|
8
|
+
class TimeSeriesProcessor(BaseEstimator, TransformerMixin):
|
|
9
|
+
""""
|
|
10
|
+
- Autor: BALDEZZARI Lucas
|
|
11
|
+
- Creación: 8 de enero de 2024
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
def __init__(self):
|
|
15
|
+
"""Inicializa la clase TimeSeriesProcessor."""
|
|
16
|
+
|
|
17
|
+
self.is_fitted = False
|
|
18
|
+
|
|
19
|
+
def fit(self, X: np.array, y=None)-> np.array:
|
|
20
|
+
"""Fittea el objeto"""
|
|
21
|
+
|
|
22
|
+
##asserteamos que X sea un np.array
|
|
23
|
+
assert isinstance(X, np.ndarray), "X debe ser un np.array"
|
|
24
|
+
##asserteamos que X tenga dos columnas
|
|
25
|
+
assert X.ndim == 2, "X debe ser de la forma (n, 2)"
|
|
26
|
+
##asserteamos que X no tenga valores nulos
|
|
27
|
+
assert not np.isnan(X).any(), "X no debe tener valores nulos"
|
|
28
|
+
##chequeamos que X tenga una sola fila, si es así, enviamos un warning y agregamos una fila copiando la única fila que tiene
|
|
29
|
+
if X.shape[0] == 1:
|
|
30
|
+
warnings.warn("X tiene una sola fila, se agregará una fila copiando la única fila que tiene")
|
|
31
|
+
X = np.vstack((X, X))
|
|
32
|
+
|
|
33
|
+
##calculamos la diferencia entre los timestamps. La forma de calcular estos tiempos se enecuentra en los apuntes de identificación "Intervalos de tiempo" del siguiente link:
|
|
34
|
+
#https://drive.google.com/file/d/1I7a_AHsGI2n5gPBOBT_oRmsqm-xt9kI9/view?usp=sharing
|
|
35
|
+
|
|
36
|
+
self._deltaO = np.diff(X[:,0]) #deltaO = Ttiempo operación siguiente - Ttiempo operación actual
|
|
37
|
+
##agrego un 0 al principio de la serie
|
|
38
|
+
# self._deltaO = np.hstack((0, self._deltaO))
|
|
39
|
+
self._deltaP = X[:,1][1:]
|
|
40
|
+
self._deltaC = self._deltaO - self._deltaP
|
|
41
|
+
##hago cero el primer vlaor de deltaC
|
|
42
|
+
|
|
43
|
+
self.is_fitted = True
|
|
44
|
+
|
|
45
|
+
def transform(self, X: np.array):
|
|
46
|
+
"""Genera un array con los tiempos de operación, caminata y pico abierto."""
|
|
47
|
+
|
|
48
|
+
if not self.is_fitted:
|
|
49
|
+
raise RuntimeError("El modelo no ha sido fitteado.")
|
|
50
|
+
|
|
51
|
+
return np.hstack((self._deltaO.reshape(-1, 1), self._deltaC.reshape(-1, 1), self._deltaP.reshape(-1, 1))).round(2)
|
|
52
|
+
|
|
53
|
+
def fit_transform(self, X: np.array, y=None):
|
|
54
|
+
self.fit(X)
|
|
55
|
+
return self.transform(X)
|
|
56
|
+
|
|
57
|
+
@property
|
|
58
|
+
def deltaO(self):
|
|
59
|
+
"""Devuelve el tiempo de operación."""
|
|
60
|
+
return self._deltaO
|
|
61
|
+
|
|
62
|
+
@property
|
|
63
|
+
def deltaC(self):
|
|
64
|
+
"""Devuelve el tiempo de caminata."""
|
|
65
|
+
return self._deltaC
|
|
66
|
+
|
|
67
|
+
@property
|
|
68
|
+
def deltaP(self):
|
|
69
|
+
"""Devuelve el tiempo de pico abierto."""
|
|
70
|
+
return self._deltaP
|
|
71
|
+
|
|
72
|
+
if __name__ == "__main__":
|
|
73
|
+
timestamps = np.array([1697724423, 1697724428, 1697724430, 1697724433])
|
|
74
|
+
tlm_data = np.array(["0010001000001100110000001100001000000000000000001111111000110000",
|
|
75
|
+
"0010001000001100110000101100000000000000000000001111111000110000",
|
|
76
|
+
"0010001000001100101100101100000000000000000000001111111000110000",
|
|
77
|
+
"0010001000001100101100001100000000000000000000001111111000110000"])
|
|
78
|
+
|
|
79
|
+
from sarapy.dataProcessing import TLMSensorDataExtractor
|
|
80
|
+
tlm_extractor = TLMSensorDataExtractor()
|
|
81
|
+
tlm_extractor.fit(tlm_data)
|
|
82
|
+
|
|
83
|
+
deltaPicos = tlm_extractor.TIMEAC
|
|
84
|
+
|
|
85
|
+
tmsp = TimeSeriesProcessor()
|
|
86
|
+
|
|
87
|
+
#creamos un array con los timestamps y los tiempos de pico abierto de la forma (n, 2)
|
|
88
|
+
X = np.hstack((timestamps.reshape(-1, 1), deltaPicos.reshape(-1, 1)))
|
|
89
|
+
tmsp.fit(X)
|
|
90
|
+
tmsp.transform(X)
|
|
91
|
+
tmsp.fit_transform(X)
|
|
92
|
+
|
|
93
|
+
### PROBAMOS QUÉ SUCEDE SI TENEMOS UNA SOLA FILA
|
|
94
|
+
tlm_data2 = np.array(["0010001000001100110000001100001000000000000000001111111000110000"])
|
|
95
|
+
timestamps2 = np.array([1697724423])
|
|
96
|
+
|
|
97
|
+
tmsp2 = TimeSeriesProcessor()
|
|
98
|
+
tlm_extractor2 = TLMSensorDataExtractor()
|
|
99
|
+
|
|
100
|
+
tlm_extractor2.fit(tlm_data2)
|
|
101
|
+
|
|
102
|
+
X2 = np.hstack((timestamps2.reshape(-1, 1), tlm_extractor2.TIMEAC.reshape(-1, 1)))
|
|
103
|
+
|
|
104
|
+
tmsp2.fit(X2)
|
|
105
|
+
tmsp2.transform(X2)
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
## Version of the package
|
|
2
|
-
__version__ = "0.1
|
|
2
|
+
__version__ = "0.2.1"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: sarapy
|
|
3
|
-
Version: 0.1
|
|
3
|
+
Version: 0.2.1
|
|
4
4
|
Summary: Library for Sarapico Metadata processing
|
|
5
5
|
Home-page: https://github.com/lucasbaldezzari/sarapy
|
|
6
6
|
Author: Lucas Baldezzari
|
|
@@ -24,6 +24,16 @@ Requires-Dist: geopy
|
|
|
24
24
|
|
|
25
25
|
Library for processing SARAPICO project metadata of _AMG_.
|
|
26
26
|
|
|
27
|
+
#### Version 0.2.1
|
|
28
|
+
|
|
29
|
+
- Se corrige _init.py_ de dataProcessing.
|
|
30
|
+
|
|
31
|
+
#### Version 0.2.0
|
|
32
|
+
|
|
33
|
+
- Transforming some attributs to private attributes. Adding @property for getters.
|
|
34
|
+
- Created GNSSDataProcessor class.
|
|
35
|
+
- Created TimeSeriesProcessor class.
|
|
36
|
+
|
|
27
37
|
#### Version 0.1.4
|
|
28
38
|
|
|
29
39
|
Setting an **init**.py file for TLMSensorDataExtractor module.
|
|
@@ -8,5 +8,7 @@ sarapy.egg-info/SOURCES.txt
|
|
|
8
8
|
sarapy.egg-info/dependency_links.txt
|
|
9
9
|
sarapy.egg-info/requires.txt
|
|
10
10
|
sarapy.egg-info/top_level.txt
|
|
11
|
+
sarapy/dataProcessing/GeoAnalyzer.py
|
|
11
12
|
sarapy/dataProcessing/TLMSensorDataExtractor.py
|
|
13
|
+
sarapy/dataProcessing/TimeSeriesProcessor.py
|
|
12
14
|
sarapy/dataProcessing/__init__.py
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
from .TLMSensorDataExtractor import TLMSensorDataExtractor
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|