sarapy 0.3.3__tar.gz → 0.3.5__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sarapy
3
- Version: 0.3.3
3
+ Version: 0.3.5
4
4
  Summary: Library for Sarapico Metadata processing
5
5
  Home-page: https://github.com/lucasbaldezzari/sarapy
6
6
  Author: Lucas Baldezzari
@@ -24,9 +24,17 @@ Requires-Dist: geopy
24
24
 
25
25
  Library for processing SARAPICO project metadata of _AMG_.
26
26
 
27
+ #### Version 0.3.5
28
+
29
+ - Se implementa clase _DistanceImputer_.
30
+
31
+ #### Version 0.3.4
32
+
33
+ - Se actializa _dataPositions_ de PlantinFMCreator.
34
+
27
35
  #### Version 0.3.3
28
36
 
29
- - Se el nombre de la clase FMCreator a PlantinFMCreator. Se modifica la matriz transformada quitando el dato de distorsión de Fertilizante.
37
+ - Se cambia el nombre de la clase FMCreator a PlantinFMCreator. Se modifica la matriz transformada quitando el dato de distorsión de Fertilizante.
30
38
 
31
39
  #### Version 0.3.2
32
40
 
@@ -2,9 +2,17 @@
2
2
 
3
3
  Library for processing SARAPICO project metadata of _AMG_.
4
4
 
5
+ #### Version 0.3.5
6
+
7
+ - Se implementa clase _DistanceImputer_.
8
+
9
+ #### Version 0.3.4
10
+
11
+ - Se actializa _dataPositions_ de PlantinFMCreator.
12
+
5
13
  #### Version 0.3.3
6
14
 
7
- - Se el nombre de la clase FMCreator a PlantinFMCreator. Se modifica la matriz transformada quitando el dato de distorsión de Fertilizante.
15
+ - Se cambia el nombre de la clase FMCreator a PlantinFMCreator. Se modifica la matriz transformada quitando el dato de distorsión de Fertilizante.
8
16
 
9
17
  #### Version 0.3.2
10
18
 
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "sarapy"
3
3
 
4
- version = "0.3.3"
4
+ version = "0.3.5"
5
5
  authors = [
6
6
  {name = "Lucas Baldezzari", email = "lmbaldezzari@gmail.com"},]
7
7
  maintainers = [
@@ -25,8 +25,7 @@ class PlantinFMCreator(BaseEstimator, TransformerMixin):
25
25
 
26
26
  ##creamos un diccionario para saber la posición de cada dato dentro del array devuelto por transform()
27
27
  self._dataPositions = {
28
- "DST_PT": 0, "DST_FT": 1,
29
- "deltaO": 2, "ratio_dCdP": 3, "distances": 4}
28
+ "DST_PT": 0, "deltaO": 2, "ratio_dCdP": 3, "distances": 4}
30
29
 
31
30
  def fit(self, X: np.array, y=None)-> np.array:
32
31
  """Fittea el objeto
@@ -47,13 +47,22 @@ class TLMSensorDataExtractor(BaseEstimator, TransformerMixin):
47
47
 
48
48
  ##creamos un diccionario para saber la posición de cada dato dentro del array devuelto por transform()
49
49
  self._dataPositions = {
50
- "RFFlag": 0, "GNSSFlag": 1, "RFIDFlag": 2, "FLASHFlag": 3, "RTCSFlag": 4, "MODEFlag": 5, "NBAT": 6, "TIMEAC": 7, "ESTAC": 8, "DSTRPT": 9, "INESTPT": 10, "OFFSPT": 11, "DSTRFT": 12, "INESTFT": 13, "OFFSFT": 14, "PMSTFlag": 15, "GYROX": 16, "GYROY": 17, "GYROZ": 18, "ACELX": 19, "ACELY": 20, "ACELZ": 21, "ESTMOFlag": 22, "ESTORFlag": 23, "SBAT": 24, "VBAT": 25, "CBAT": 26, "ESTBMSFlag": 27, "FIX": 28, "SIV": 29}
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}
51
56
 
52
57
  # self.kilometers = kwargs.pop('kilometers', 0)
53
58
  self.is_fitted = False
54
59
 
55
60
  def fit(self, X, y=None):
56
- """Método para generar datos a partir de la metadata."""
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
+ """
57
66
 
58
67
  ##chequeamos si todos los strings de X tienen la misma longitud, sino arrojamos un assert
59
68
  assert all(len(x) == len(X[0]) for x in X), "Todos los strings de X deben tener la misma longitud"
@@ -93,7 +102,11 @@ class TLMSensorDataExtractor(BaseEstimator, TransformerMixin):
93
102
 
94
103
 
95
104
  def transform(self, X, y=None):
96
- """Transforma los datos de entrada en un array de numpy."""
105
+ """Transforma los datos de entrada en un array de numpy.
106
+
107
+ Args:
108
+ - 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.
109
+ """
97
110
 
98
111
  ##chequeamos si se ha llamado a fit(). Sino, se arroja un error
99
112
  if not self.is_fitted:
@@ -131,7 +144,11 @@ class TLMSensorDataExtractor(BaseEstimator, TransformerMixin):
131
144
  self._SIV]).T
132
145
 
133
146
  def fit_transform(self, X, y=None):
134
- """Combinamos fit() y transform() en un solo método."""
147
+ """Combinamos fit() y transform() en un solo método.
148
+
149
+ Args:
150
+ - 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.
151
+ """
135
152
  self.fit(X)
136
153
  return self.transform(X)
137
154
 
@@ -0,0 +1,172 @@
1
+ ###Documentación en https://github.com/lucasbaldezzari/sarapy/blob/main/docs/Docs.md
2
+
3
+ import numpy as np
4
+ from sklearn.base import BaseEstimator, TransformerMixin
5
+ from sarapy.dataProcessing import TLMSensorDataExtractor, TimeSeriesProcessor, GeoProcessor
6
+
7
+ class DistancesImputer(BaseEstimator, TransformerMixin):
8
+ """La clase PlantinDataImuter se encarga de imputar/modificar los datos de telemetría entregados por el sistema. Se utilizan las clases TLMSensorDataExtractor, TimeSeriesProcessor y GeoProcessor para realizar las transformaciones necesarias y luego aplicar las modificaciones necesarias en base a las reglas definidas luego del análisis estadístico.
9
+ """
10
+
11
+ def __init__(self, distanciaMedia:float = 1.8, umbral_mismo_lugar:float = 0.3, umbral_ratio_dCdP:float = 0.5, deltaO_medio = 4):
12
+ """Constructor de la clase PlantinDataImputer.
13
+
14
+ Args:
15
+ - distanciaMedia: Distancia media entre operaciones.
16
+ - umbral_mismo_lugar: Umbral para considerar que dos operaciones son el mismo lugar.
17
+ - umbral_ratio_dCdP: Umbral para el ratio entre el delta de caminata y el delta de pico abierto.
18
+ - deltaO_medio: delta de operación medio entre operaciones.
19
+ """
20
+
21
+ self.is_fitted = False
22
+ self._distanciaMedia = distanciaMedia
23
+ self._umbral_mismo_lugar = umbral_mismo_lugar
24
+ self._umbral_ratio_dCdP = umbral_ratio_dCdP
25
+ self._deltaO_medio = deltaO_medio
26
+ self._dataPositions = {"distancias":0} #posición de los datos en el array devuelto por transform()
27
+
28
+ def fit(self, X:np.array, y = None):
29
+ """Fittea el objeto
30
+
31
+ Params:
32
+ - X: Es un array con los datos provenientes (strings) de la base de datos histórica. La forma de X es (n,6)Las columnas de X son,
33
+ - 0: distancia entre operaciones
34
+ - 1: presición del GPS
35
+ - 2: GNSSflag. Nandera para saber si hay dato GPS, donde 0 es que hay dato y 1 que no hay dato
36
+ - 3: FIX bandera para tipo de fijación GNSS (ver valores enhttps://trello.com/c/M6DWjpwr/70-definici%C3%B3n-metadatos-a-relevar)
37
+ - 4: deltaO
38
+ - 5: ratio_dCdP
39
+
40
+ NOTA: En versiones futuras se considerarán los datos de la posición (vertical, horizontal, etc) del sarapico
41
+ """
42
+
43
+ ##agregar asserts y warnings
44
+
45
+ self._distancias = X[:,0] #distancias
46
+ self._precision = X[:,1]
47
+ self._GNSSflag = X[:,2]
48
+ self._FIX = X[:,3]
49
+ self._deltaO = X[:,4]
50
+ self._ratio_dCdP = X[:,5]
51
+
52
+ def transform(self, X:np.array, y = None):
53
+ """Aplica las imputaciones para transformar el objeto y retorna el array transformado.
54
+
55
+ Args:
56
+ - X: Es un array con los datos provenientes (strings) de la base de datos histórica. La forma de X es (n,6)Las columnas de X son,
57
+
58
+ Returns:
59
+ - updatedDistances: Array con las distancias imputadas.
60
+ """
61
+
62
+ self._updatedDistances = self._imputeDistance()
63
+ return self._updatedDistances
64
+
65
+ def fit_transform(self, X:np.array, y = None):
66
+ """Fitea y aplica las imputaciones para transformar el objeto. Retorna el array transformado.
67
+
68
+ Args:
69
+ - X: Es un array con los datos provenientes (strings) de la base de datos histórica. La forma de X es (n,6)Las columnas de X son,
70
+
71
+ Returns:
72
+ - updatedDistances: Array con las distancias imputadas.
73
+ """
74
+ self.fit(X)
75
+ return self.transform(X)
76
+
77
+ def _imputeDistance(self):
78
+ """Imputa la distancia entre operaciones.
79
+
80
+ Si GNSSflag = 0, hay dato GPS, si GNSSflag = 1, no hay dato GPS.
81
+ Si la precisión es menor al umbral del mismo lugar entonces se considera que la precision es buena.
82
+
83
+ Luego,
84
+
85
+ Caso 0: GNSSflag = 0 y precision < umbral_mismo_lugar -> la distancia no cambia
86
+ Caso 1: GNSSflag = 0 y precision > umbral_mismo_lugar -> la distancia se reemplazará por la distancia media si el ratio_dCdP es mayor al umbral_ratio_dCdP, sino por la distancia umbral_mismo_lugar
87
+ """
88
+
89
+ caso1_indexes = np.where((self._GNSSflag == 0) & (self._precision > self._umbral_mismo_lugar))
90
+
91
+ #copiamos self._distances en updatedDistances
92
+ updatedDistances = self._distancias
93
+
94
+ if len(caso1_indexes[0]) > 0:
95
+ updatedDistances[caso1_indexes] = np.vectorize(lambda x: self._umbral_mismo_lugar
96
+ if x < self._umbral_ratio_dCdP
97
+ else self._distanciaMedia)(self.ratio_dCdP[caso1_indexes])
98
+
99
+ return updatedDistances
100
+
101
+ def _checkDeltaTimes(self, ratio_dCdP):
102
+ """Chqequea que el ratio_dCdP"""
103
+
104
+ return self._umbral_mismo_lugar if ratio_dCdP < self._umbral_ratio_dCdP else self._distanciaMedia
105
+
106
+ @property
107
+ def distancias(self):
108
+ return self._distancias
109
+
110
+ @property
111
+ def precision(self):
112
+ return self._precision
113
+
114
+ @property
115
+ def GNSSflag(self):
116
+ return self._GNSSflag
117
+
118
+ @property
119
+ def FIX(self):
120
+ return self._FIX
121
+
122
+ @property
123
+ def deltaO(self):
124
+ return self._deltaO
125
+
126
+ @property
127
+ def ratio_dCdP(self):
128
+ return self._ratio_dCdP
129
+
130
+ @property
131
+ def updatedDistances(self):
132
+ return self._updatedDistances
133
+
134
+
135
+ if __name__ == "__main__":
136
+ tlmda = TLMSensorDataExtractor()
137
+ tsa = TimeSeriesProcessor()
138
+ gpa = GeoProcessor()
139
+
140
+ ##datos de ejemplo
141
+ tlmsbp_sample = np.array(['0010001000010010110000011000000111111101001000000000000000000000',
142
+ '0010001000010100110000011000000111111101001000000000000000000000',
143
+ '0010001000010000110000011000000111111101001000000000000000000000',
144
+ '0010001000011010110000011000110111111101001000000000000000000000'])
145
+
146
+ date_oprc = np.array([35235, 35240, 35244, 35248])
147
+ lats = np.array(["-32.331093", "-32.331116", "-32.331131", "-32.331146"]).astype(float)
148
+ lons = np.array(["-57.229733", "-57.229733", "-57.229733", "-57.22974"]).astype(float)
149
+
150
+ precisiones = np.array([0.25, 0.1, 0.1, 0.2])
151
+
152
+ tlmda_data = tlmda.fit_transform(tlmsbp_sample)
153
+ timesAC = tlmda.ESTAC
154
+
155
+ time_data = np.hstack((date_oprc.reshape(-1, 1), timesAC.reshape(-1, 1)))
156
+ tsa_data = tsa.fit_transform(time_data)
157
+
158
+ ##genero puntos donde la primer columna es latitud y la segunda longitud
159
+ puntos = np.hstack((lats.reshape(-1, 1), lons.reshape(-1, 1)))
160
+ distancias = gpa.fit_transform(puntos)
161
+
162
+ X = np.hstack((distancias.reshape(-1, 1),
163
+ precisiones.reshape(-1, 1),
164
+ tlmda.GNSSFlag.reshape(-1,1),
165
+ tlmda.FIX.reshape(-1,1), tsa.deltaO.reshape(-1,1),
166
+ tsa.ratio_dCdP.reshape(-1,1)))
167
+
168
+ distanceimputer = DistancesImputer()
169
+ distanceimputer.fit(X)
170
+
171
+ print(distanceimputer.transform(X))
172
+ print(distanceimputer.fit_transform(X))
@@ -0,0 +1 @@
1
+ from .DistancesImputer import DistancesImputer
@@ -1,2 +1,2 @@
1
1
  ## Version of the package
2
- __version__ = "0.3.3"
2
+ __version__ = "0.3.5"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sarapy
3
- Version: 0.3.3
3
+ Version: 0.3.5
4
4
  Summary: Library for Sarapico Metadata processing
5
5
  Home-page: https://github.com/lucasbaldezzari/sarapy
6
6
  Author: Lucas Baldezzari
@@ -24,9 +24,17 @@ Requires-Dist: geopy
24
24
 
25
25
  Library for processing SARAPICO project metadata of _AMG_.
26
26
 
27
+ #### Version 0.3.5
28
+
29
+ - Se implementa clase _DistanceImputer_.
30
+
31
+ #### Version 0.3.4
32
+
33
+ - Se actializa _dataPositions_ de PlantinFMCreator.
34
+
27
35
  #### Version 0.3.3
28
36
 
29
- - Se el nombre de la clase FMCreator a PlantinFMCreator. Se modifica la matriz transformada quitando el dato de distorsión de Fertilizante.
37
+ - Se cambia el nombre de la clase FMCreator a PlantinFMCreator. Se modifica la matriz transformada quitando el dato de distorsión de Fertilizante.
30
38
 
31
39
  #### Version 0.3.2
32
40
 
@@ -12,4 +12,6 @@ sarapy/dataProcessing/GeoProcessor.py
12
12
  sarapy/dataProcessing/PlantinFMCreator.py
13
13
  sarapy/dataProcessing/TLMSensorDataExtractor.py
14
14
  sarapy/dataProcessing/TimeSeriesProcessor.py
15
- sarapy/dataProcessing/__init__.py
15
+ sarapy/dataProcessing/__init__.py
16
+ sarapy/preprocessing/DistancesImputer.py
17
+ sarapy/preprocessing/__init__.py
File without changes
File without changes
File without changes