sarapy 0.3.10__tar.gz → 0.4.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.
Files changed (28) hide show
  1. sarapy-0.4.1/PKG-INFO +31 -0
  2. sarapy-0.4.1/README.md +15 -0
  3. {sarapy-0.3.10 → sarapy-0.4.1}/pyproject.toml +3 -2
  4. {sarapy-0.3.10 → sarapy-0.4.1}/sarapy/dataProcessing/GeoProcessor.py +22 -16
  5. sarapy-0.4.1/sarapy/dataProcessing/OpsProcessor.py +288 -0
  6. sarapy-0.3.10/sarapy/dataProcessing/TLMSensorDataExtractor.py → sarapy-0.4.1/sarapy/dataProcessing/TLMSensorDataProcessor.py +2 -2
  7. {sarapy-0.3.10 → sarapy-0.4.1}/sarapy/dataProcessing/TimeSeriesProcessor.py +23 -18
  8. sarapy-0.4.1/sarapy/dataProcessing/__init__.py +4 -0
  9. sarapy-0.4.1/sarapy/mlProcessors/PlantinClassifier.py +58 -0
  10. {sarapy-0.3.10/sarapy/dataProcessing → sarapy-0.4.1/sarapy/mlProcessors}/PlantinFMCreator.py +30 -37
  11. sarapy-0.4.1/sarapy/mlProcessors/__init__.py +0 -0
  12. {sarapy-0.3.10 → sarapy-0.4.1}/sarapy/preprocessing/DistancesImputer.py +5 -4
  13. sarapy-0.4.1/sarapy/preprocessing/FertilizerImputer.py +34 -0
  14. sarapy-0.4.1/sarapy/preprocessing/__init__.py +2 -0
  15. {sarapy-0.3.10 → sarapy-0.4.1}/sarapy/version.py +1 -1
  16. sarapy-0.4.1/sarapy.egg-info/PKG-INFO +31 -0
  17. {sarapy-0.3.10 → sarapy-0.4.1}/sarapy.egg-info/SOURCES.txt +6 -2
  18. {sarapy-0.3.10 → sarapy-0.4.1}/setup.py +1 -1
  19. sarapy-0.3.10/PKG-INFO +0 -124
  20. sarapy-0.3.10/README.md +0 -102
  21. sarapy-0.3.10/sarapy/dataProcessing/__init__.py +0 -4
  22. sarapy-0.3.10/sarapy/preprocessing/__init__.py +0 -1
  23. sarapy-0.3.10/sarapy.egg-info/PKG-INFO +0 -124
  24. {sarapy-0.3.10 → sarapy-0.4.1}/sarapy/__init__.py +0 -0
  25. {sarapy-0.3.10 → sarapy-0.4.1}/sarapy.egg-info/dependency_links.txt +0 -0
  26. {sarapy-0.3.10 → sarapy-0.4.1}/sarapy.egg-info/requires.txt +0 -0
  27. {sarapy-0.3.10 → sarapy-0.4.1}/sarapy.egg-info/top_level.txt +0 -0
  28. {sarapy-0.3.10 → sarapy-0.4.1}/setup.cfg +0 -0
sarapy-0.4.1/PKG-INFO ADDED
@@ -0,0 +1,31 @@
1
+ Metadata-Version: 2.1
2
+ Name: sarapy
3
+ Version: 0.4.1
4
+ Home-page: https://github.com/lucasbaldezzari/sarapy
5
+ Author: Lucas Baldezzari
6
+ Author-email: Lucas Baldezzari <lmbaldezzari@gmail.com>
7
+ Maintainer-email: Lucas Baldezzari <lmbaldezzari@gmail.com>
8
+ License: Your license text goes here
9
+ Description-Content-Type: text/markdown
10
+ Requires-Dist: numpy
11
+ Requires-Dist: matplotlib
12
+ Requires-Dist: pandas
13
+ Requires-Dist: scipy
14
+ Requires-Dist: scikit-learn
15
+ Requires-Dist: geopy
16
+
17
+ # SARAPY
18
+
19
+ Library for processing SARAPICO project metadata of _AMG_.
20
+
21
+ #### Version 0.4.1 (working)
22
+
23
+ - Se corrigen problemas de importaciones circulares.
24
+
25
+ #### Version 0.4.0
26
+
27
+ - Se implementa _OpsProcessor_.
28
+ - Se implementa _PlanntinClassifier_.
29
+ - Se corrige salida de _transform()_ y _fit_transform()_ de GeoProcessor.
30
+ - Se mueve PlantinFMCreator a mlProcessors
31
+ - Se cambia nombre de TLMSensorDataCreator a TLMSensorDataProcessor
sarapy-0.4.1/README.md ADDED
@@ -0,0 +1,15 @@
1
+ # SARAPY
2
+
3
+ Library for processing SARAPICO project metadata of _AMG_.
4
+
5
+ #### Version 0.4.1 (working)
6
+
7
+ - Se corrigen problemas de importaciones circulares.
8
+
9
+ #### Version 0.4.0
10
+
11
+ - Se implementa _OpsProcessor_.
12
+ - Se implementa _PlanntinClassifier_.
13
+ - Se corrige salida de _transform()_ y _fit_transform()_ de GeoProcessor.
14
+ - Se mueve PlantinFMCreator a mlProcessors
15
+ - Se cambia nombre de TLMSensorDataCreator a TLMSensorDataProcessor
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "sarapy"
3
3
 
4
- version = "0.3.10"
4
+ version = "0.4.1"
5
5
  authors = [
6
6
  {name = "Lucas Baldezzari", email = "lmbaldezzari@gmail.com"},]
7
7
  maintainers = [
@@ -17,4 +17,5 @@ dependencies = [
17
17
  "geopy",
18
18
  ]
19
19
 
20
- readme = "README.md"
20
+ readme = "README.md"
21
+ license = {text = "Your license text goes here"}
@@ -15,15 +15,16 @@ class GeoProcessor(BaseEstimator, TransformerMixin):
15
15
  self.is_fitted = False
16
16
 
17
17
  @staticmethod
18
- def getDistance(point1: np.array, point2: np.array) ->float:
19
- """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.
18
+ def getDistance(point1: float, point2: float) ->float:
19
+ """Calcula la distancia elipsoidal (en metros) entre los puntos p1 y p2 donde cada punto
20
+ está representado como un array con un valor de latitud y otro de longitud.
20
21
 
21
22
  Parametros
22
- point1 (np.array): array con los valores de latitud y longitud del punto 1
23
- point2 (np.array): array con los valores de latitud y longitud del punto 2
23
+ point1 (float): array con los valores de latitud y longitud del punto 1
24
+ point2 (float): array con los valores de latitud y longitud del punto 2
24
25
 
25
26
  Returns:
26
- float: np.array con las distancias entre los dos puntos
27
+ float con las distancias entre los dos puntos
27
28
  """
28
29
 
29
30
  ##aplicamos la función geodesic
@@ -38,11 +39,12 @@ class GeoProcessor(BaseEstimator, TransformerMixin):
38
39
  assert isinstance(X, np.ndarray), "X debe ser un np.array"
39
40
  ##asserteamos que X tenga dos columnas
40
41
  assert X.ndim == 2, "X debe ser de la forma (n, 2)"
41
- ##asserteamos que X no tenga valores nulos
42
- assert not np.isnan(X).any(), "X no debe tener valores nulos"
42
+ # ##asserteamos que X no tenga valores nulos
43
+ # assert not np.isnan(X).any(), "X no debe tener valores nulos"
43
44
  ##chequeamos que X tenga una sola fila, si es así, enviamos un warning
44
45
  if X.shape[0] == 1:
45
- warnings.warn("X tiene una sola fila, se recomienda utilizar fit_transform")
46
+ warnings.warn("En GeoProcesor.fit(): X tiene una sola fila, por lo tanto no se puede computar la distancia entre los puntos.\
47
+ \n Se devolverá un array con un solo valor de 0.0.")
46
48
 
47
49
  self._points = X
48
50
  self.is_fitted = True
@@ -60,9 +62,9 @@ class GeoProcessor(BaseEstimator, TransformerMixin):
60
62
 
61
63
  if self._points.shape[0] >= 2:
62
64
  ##calculamos la distancia entre los puntos de latitud y longitud dentro de X
63
- self._distances = np.array([self.getDistance(point1, point2) for point1, point2 in zip(self.points,self.points[1:])]).round(2)
64
- #agrego un cero al final del array
65
- self._distances = np.append(self._distances, 0)
65
+ self._distances = np.array([self.getDistance(point1, point2) for point1, point2 in zip(self.points[1:],self.points)]).round(2)
66
+ #agrego un cero al inicio de la lista de distancias ya que el primer punto no tiene una operación previo con la cual comparar
67
+ self._distances = np.insert(self._distances, 0, 0)
66
68
 
67
69
  elif self._points.shape[0] == 1:
68
70
  self._distances = np.array([0])
@@ -97,13 +99,17 @@ class GeoProcessor(BaseEstimator, TransformerMixin):
97
99
 
98
100
 
99
101
  if __name__ == "__main__":
102
+
103
+ import pandas as pd
104
+ import numpy as np
105
+ import os
106
+ path = os.path.join(os.getcwd(), "examples\\volcado_17112023_NODE_processed.csv")
107
+ raw_data = pd.read_csv(path, sep=";", ).to_numpy()
108
+
100
109
  ga = GeoProcessor()
101
110
 
102
- puntos = np.array([[-32.329910, -57.229061],
103
- [ -32.329895, -57.229061],
104
- [-32.329880, -57.229069],
105
- [-32.329865, -57.229069]])
106
-
111
+ puntos = raw_data[50:60, 4:6]
112
+
107
113
  ga.fit(puntos)
108
114
  print(ga.transform(puntos))
109
115
  print(ga.fit_transform(puntos))
@@ -0,0 +1,288 @@
1
+ ###Documentación en https://github.com/lucasbaldezzari/sarapy/blob/main/docs/Docs.md
2
+ import warnings
3
+ import numpy as np
4
+ # from sarapy.mlProcessors import PlantinFMCreator
5
+ from sarapy.mlProcessors import PlantinClassifier
6
+
7
+
8
+ class OpsProcessor():
9
+ """Clase para procesar las operaciones de los operarios. La información se toma de la base de datos
10
+ hostórica y se procesa para obtener un array con las operaciones clasificadas para cada operario.
11
+
12
+ La clase recibe una muestra desde la base de datos histórica y la procesa para obtener las
13
+ operaciones clasificadas para cada operario. Se clasifican las operaciones desde el punto de vista
14
+ del plantín y del fertilizante. La clasificación del tipo de operación respecto de plantín se hace
15
+ con el pipeline para plantín, idem para el fertilizante.
16
+ """
17
+
18
+ def __init__(self, distanciaMedia = 1.8, umbral_precision = 0.3, dist_mismo_lugar = 0.0,
19
+ max_dist = 100, umbral_ratio_dCdP = 0.5, deltaO_medio = 4,
20
+ keepDimsPFMC = False, columnToImputePFMC = 0):
21
+ """Constructor de la clase OpsProcessor.
22
+
23
+ Args:
24
+ - distanciaMedia: Distancia media entre operaciones.
25
+ """
26
+
27
+ # self._plantinFMCreator = PlantinFMCreator(distanciaMedia = distanciaMedia, umbral_precision = umbral_precision,
28
+ # dist_mismo_lugar = dist_mismo_lugar, max_dist = max_dist,
29
+ # umbral_ratio_dCdP = umbral_ratio_dCdP, deltaO_medio = deltaO_medio)
30
+
31
+ self._plantin_classifier = PlantinClassifier.PlantinClassifier()
32
+ # self._fertilizerFMCreator = FertilizerFMCreator() ## PARA IMPLEMENTAR
33
+
34
+ self._operationsDict = {} ##diccionario de operarios con sus operaciones
35
+ self._classifiedOperations = np.array([]) ##array con las operaciones clasificadas
36
+ self._last_row_db = 0 ##indicador de la última fila de los datos extraidos de la base de datos histórica
37
+
38
+ def processOperations(self, newSample):
39
+ """Método para procesar las operaciones de los operarios.
40
+
41
+ Se toma una nueva muestra y se procesa la información para clasificar las operaciones considerando el
42
+ plantín y por otro lado el fertilizante.
43
+ Se retorna un array con las clasificaciones concatenadas, manteniendo el orden de las operaciones por operario.
44
+
45
+ Args:
46
+ - newSample: lista con los datos (numpy.array de strings) de una muestra de operaciones.
47
+ La forma de cada dato dentro de la lista newSample es (n,6). Las columnas de newSample son,
48
+
49
+ - 0: op_number
50
+ - 1: id_oprr
51
+ - 2: tlm_spbb
52
+ - 3: date_oprc
53
+ - 4: lat
54
+ - 5: lon
55
+ - 6: precision
56
+ """
57
+
58
+ ##chqueo que newSample no esté vacío
59
+ if len(newSample) != 0:
60
+ #Si tenemos nuevas operaciones, actualizamos el diccionario de operaciones
61
+ self.updateOperationsDict(newSample) #actualizamos diccionario interno de la clase
62
+ plantinClassifications = self.classifyForPlantin() #clasificamos las operaciones para plantín
63
+ # ops_numbers = newSample[:,0]
64
+ ops_numbers = self.getActualOperationsNumbers() #obtenemos los números de operaciones desde el diccionario de operaciones
65
+ return plantinClassifications.round(2), ops_numbers
66
+
67
+ else:
68
+ self.resetAllNewSamplesValues()
69
+ return None
70
+
71
+ def updateOperationsDict(self, newSample):
72
+ """Actualiza el diccionario de operaciones.
73
+
74
+ Args:
75
+ - newSample: lista con los datos (numpy.array de strings) de las operaciones.
76
+ La forma de cada dato dentro de la lista newSample es (n,6). Las columnas de newSample son,
77
+
78
+ - 0: op_number
79
+ - 1: id_oprr
80
+ - 2: tlm_spbb
81
+ - 3: date_oprc
82
+ - 4: lat
83
+ - 5: lon
84
+ - 6: precision
85
+
86
+ Returns:
87
+ - None
88
+ NOTA: PENSAR SI SE DEVUELVE ALGO COMO UN TRUE O FALSE PARA SABER SI SE ACTUALIZÓ O NO EL DICCIONARIO
89
+ DE MANERA CORRECTA O HUBO ALGÚN PROBLEMA Y ASÍ VER QUÉ HACER EN EL MAIN
90
+ """
91
+
92
+ id_oprrs_w_newOperations = np.unique(newSample[:,1]) ##identificadores de operarios con nuevas operaciones en la muestra
93
+
94
+ ##chqueo si estos id_oprrs ya están en el diccionario, sino los agrego
95
+ for id_oprr in id_oprrs_w_newOperations:
96
+ if id_oprr not in self._operationsDict:
97
+ #El diccionario contiene la siguiente información:
98
+ #sample_ops: np.array con las columnas de tlm_spbb, date_oprc, lat, lon, precision
99
+ #last_oprc: np.array de la última operación con las columnas de tlm_spbb, date_oprc, lat, lon, precision
100
+ #first_day_op_classified: booleano para saber si es la primera operación del día fue clasificada
101
+ self._operationsDict[id_oprr] = {"sample_ops": None,
102
+ "last_oprc": None,
103
+ "first_day_op_classified": False,
104
+ "new_sample": False,
105
+ "ops_numbers": None} #inicio del diccionario anidado para el nuevo operario
106
+
107
+ ##actualizo el diccionario con las operaciones nuevas para aquellos operarios que correspondan
108
+ for id_oprr in id_oprrs_w_newOperations:
109
+ sample_ops = newSample[newSample[:,1] == id_oprr][:,2:] #me quedo con las columnas de tlm_spbb, date_oprc, lat, lon, precision
110
+ ops_numbers = newSample[newSample[:,1] == id_oprr][:,0]
111
+ ##actualizo el diccionario
112
+ self._operationsDict[id_oprr]["sample_ops"] = sample_ops
113
+ self._operationsDict[id_oprr]["ops_numbers"] = ops_numbers
114
+ ##chequeo si tenemos última operación, si es así, asignamos dicha operación en la primera fila de sample_ops
115
+ last_op = self._operationsDict[id_oprr]["last_oprc"]
116
+ ###si last_op es not None y last_op no está vacía, entonces concatenamos last_op con sample_ops
117
+ if last_op is not None and last_op.size != 0:
118
+ self._operationsDict[id_oprr]["sample_ops"] = np.vstack((last_op, sample_ops))
119
+
120
+ self.updateNewSamplesValues(id_oprrs_w_newOperations) #actualizo el estado de 'new_sample' en el diccionario de operaciones
121
+ self.updateLastOperations(id_oprrs_w_newOperations) #actualizo la última operación de una muestra de operaciones en el diccionario de operaciones
122
+
123
+ def classifyForPlantin(self):
124
+ """Método para clasificar las operaciones para plantín.
125
+ Se recorre el diccionario de operaciones y se clasifican las operaciones para plantín.
126
+
127
+ Returns:
128
+ - plantinClassifications: np.array con las clasificaciones de las operaciones para plantín.
129
+ """
130
+
131
+ ##creamos/reiniciamos el array con las clasificaciones de las operaciones para plantín
132
+ plantinClassifications = None
133
+
134
+ ##me quedo con los id_oprrs que tengan _operationsDict[id_oprr]["new_sample"] iguales a True
135
+ ops_with_new_sample = [id_oprr for id_oprr in self.operationsDict.keys() if self.operationsDict[id_oprr]["new_sample"]]
136
+
137
+ for id_oprr in ops_with_new_sample:#self.operationsDict.keys():
138
+ ##clasificamos las operaciones para plantín
139
+ operations = self.operationsDict[id_oprr]["sample_ops"]
140
+ classified_ops = self._plantin_classifier.classify(operations)
141
+
142
+ ##chequeo si first_day_op_classified es True, si es así, no se considera la primera fila de las classified_ops
143
+ if self.operationsDict[id_oprr]["first_day_op_classified"]:
144
+ classified_ops = classified_ops[1:]
145
+
146
+ plantinClassifications = np.vstack((plantinClassifications, classified_ops)) if plantinClassifications is not None else classified_ops
147
+
148
+ self.operationsDict[id_oprr]["first_day_op_classified"] = True
149
+
150
+ return plantinClassifications
151
+
152
+ def updateLastOperations(self, id_oprrs_w_newOperations):
153
+ """Método para actualizar la última operación de una muestra de operaciones en el diccionario de operaciones
154
+
155
+ Args:
156
+ - newSample: lista con los datos (numpy.array de strings) de las operaciones.
157
+ La forma de cada dato dentro de la lista newSample es (n,6). Las columnas de newSample son,
158
+
159
+ - 0: op_number
160
+ - 1: id_oprr
161
+ - 2: tlm_spbb
162
+ - 3: date_oprc
163
+ - 4: lat
164
+ - 5: lon
165
+ - 6: precision
166
+ """
167
+
168
+ for id_oprr in id_oprrs_w_newOperations:
169
+ self._operationsDict[id_oprr]["last_oprc"] = self._operationsDict[id_oprr]["sample_ops"][-1]
170
+
171
+ def updateOperationsNumbers(self, new_ops_numbers):
172
+ """Método para actualizar los números de operaciones en el diccionario de operaciones.
173
+
174
+ Args:
175
+ - new_ops_numbers: array de la forma (n,2) con los números de operaciones en la primer columna y los id_oprrs en la segunda.
176
+ """
177
+ id_oprrs_w_newOperations = np.unique(new_ops_numbers[:,1]) ##identificadores de operarios con nuevas operaciones en la muestra
178
+ opsNumbersList = np.array([]) ##array con los números de operaciones
179
+
180
+ for id_oprr in id_oprrs_w_newOperations:
181
+ opsNumbersList = np.append(opsNumbersList, self.operationsDict[id_oprr]["ops_numbers"].flatten())
182
+
183
+ return opsNumbersList
184
+
185
+ def updateNewSamplesValues(self, id_oprrs_w_newOperations):
186
+ """Método para actualizar el estado de 'new_sample' del diccionario de operaciones.
187
+
188
+ Args:
189
+ - id_oprrs_w_newOperations: lista con los id_oprrs que tienen nuevas operaciones.
190
+ """
191
+
192
+ ##recorro el diccionario de operaciones y actualizo el estado de 'new_sample' a
193
+ ##True para los id_oprrs que tienen nuevas operaciones y a False para los que no tienen nuevas operaciones
194
+ for id_oprr in self.operationsDict.keys():
195
+ if id_oprr in id_oprrs_w_newOperations:
196
+ self._operationsDict[id_oprr]["new_sample"] = True
197
+ else:
198
+ self._operationsDict[id_oprr]["new_sample"] = False
199
+
200
+ def resetAllNewSamplesValues(self):
201
+ """Método para resetar todos los valores de new_sample en el diccionario de operaciones.
202
+ """
203
+
204
+ for id_oprr in self.operationsDict.keys():
205
+ self._operationsDict[id_oprr]["new_sample"] = False
206
+
207
+ def getActualOperationsNumbers(self):
208
+ """Método para obtener los números de operaciones desde el diccionario de operaciones para aquellos operarios que
209
+ tienen nuevas operaciones en la muestra."""
210
+
211
+ opsNumbersList = np.array([])
212
+ for id_oprr in self.operationsDict.keys():
213
+ if self.operationsDict[id_oprr]["new_sample"]:
214
+ opsNumbersList = np.append(opsNumbersList, self.operationsDict[id_oprr]["ops_numbers"].flatten())
215
+
216
+ return opsNumbersList
217
+
218
+ def cleanSamplesOperations(self):
219
+ """Método para limpiar las operaciones de un operario en el diccionario de operaciones.
220
+
221
+ Args:
222
+ - newSample: lista con los datos (numpy.array de strings) de las operaciones.
223
+ La forma de cada dato dentro de la lista newSample es (n,6). Las columnas de newSample son,
224
+
225
+ - 0: op_number
226
+ - 1: id_oprr
227
+ - 2: tlm_spbb
228
+ - 3: date_oprc
229
+ - 4: lat
230
+ - 5: lon
231
+ - 6: precision
232
+ """
233
+
234
+ for id_oprr in self.operationsDict.keys():
235
+ self._operationsDict[id_oprr]["sample_ops"] = None
236
+
237
+ def updateFirstDayOp(self):
238
+ """Método para actualizar el indicador de si es la primera operación del día para cada operario en el diccionario de operaciones.
239
+ """
240
+
241
+ for id_oprr in self.operationsDict.keys():
242
+ self._operationsDict[id_oprr]["first_day_op_classified"] = False
243
+
244
+ @property
245
+ def operationsDict(self):
246
+ return self._operationsDict
247
+
248
+
249
+ if __name__ == "__main__":
250
+ #cargo archivo examples\volcado_17112023_NODE_processed.csv
251
+ import pandas as pd
252
+ import numpy as np
253
+ import os
254
+ path = os.path.join(os.getcwd(), "examples\\volcado_17112023_NODE_processed.csv")
255
+ data_df = pd.read_csv(path, sep=";", )
256
+ raw_data = data_df.to_numpy().astype(str)
257
+
258
+ ##seed de numpy en 42
259
+ np.random.seed(42)
260
+
261
+ size = data_df[data_df["id_oprr"] == 1].shape[0]
262
+ data_df.loc[data_df["id_oprr"] == 1, "id_dataBase"] = range(1,size+1)
263
+ size = data_df[data_df["id_oprr"] == 2].shape[0]
264
+ data_df.loc[data_df["id_oprr"] == 2, "id_dataBase"] = range(1,size+1)
265
+ ##tomo raw_data y obtengo muestras de entre 7 a 15 filas una detrás de la otra. El valor de entre 7 y 15 es aleatorio.
266
+ samples = []
267
+ index = 0
268
+ while True:
269
+ random_value = np.random.randint(8, 15)
270
+ if index + random_value < len(raw_data):
271
+ samples.append(raw_data[index:index+random_value])
272
+ else:
273
+ break
274
+ index += random_value
275
+
276
+ # from sarapy.dataProcessing import OpsProcessor
277
+ op = OpsProcessor()
278
+
279
+ op.operationsDict
280
+
281
+ ##procesamos una muestra
282
+ print(op.processOperations(samples[0]))
283
+ print(op.processOperations(np.array([])))
284
+ print(op.processOperations(samples[1]))
285
+ # ##recorro los samsamples[0]ples y los proceso
286
+ # for sample in print(op.operationsDict[":
287
+ # op.processOperations(sample)
288
+ data_df.loc[data_df["id_oprr"] == 1].head(15)
@@ -3,7 +3,7 @@
3
3
  import numpy as np
4
4
  from sklearn.base import BaseEstimator, TransformerMixin
5
5
 
6
- class TLMSensorDataExtractor(BaseEstimator, TransformerMixin):
6
+ class TLMSensorDataProcessor(BaseEstimator, TransformerMixin):
7
7
  """- Autor: BALDEZZARI Lucas
8
8
 
9
9
  Metadata utilizada: Versión 9
@@ -764,7 +764,7 @@ class TLMSensorDataExtractor(BaseEstimator, TransformerMixin):
764
764
  return self._dataPositions
765
765
 
766
766
  if __name__ == "__main__":
767
- tlmsde = TLMSensorDataExtractor()
767
+ tlmsde = TLMSensorDataProcessor()
768
768
 
769
769
  sample = np.array(["1010001000010000110000001011000000000000000000001111011010001001",
770
770
  "1010001000010000110000001011000000000000000000001111011010001001"])
@@ -3,7 +3,6 @@
3
3
  import numpy as np
4
4
  from sklearn.base import BaseEstimator, TransformerMixin
5
5
  import warnings
6
- from datetime import datetime
7
6
 
8
7
  class TimeSeriesProcessor(BaseEstimator, TransformerMixin):
9
8
  """"
@@ -22,7 +21,11 @@ class TimeSeriesProcessor(BaseEstimator, TransformerMixin):
22
21
  "deltaP": 2, "ratio_dCdP": 3}
23
22
 
24
23
  def fit(self, X: np.array, y=None)-> np.array:
25
- """Fittea el objeto"""
24
+ """Fittea el objeto
25
+
26
+ Args:
27
+ - X es un array de strings de forma (n, 2) donde la primera columna es el tiempo y la segunda columna es el tiempo de pico abierto (en segundos).
28
+ """
26
29
 
27
30
  ##asserteamos que X sea un np.array
28
31
  assert isinstance(X, np.ndarray), "X debe ser un np.array"
@@ -54,7 +57,10 @@ class TimeSeriesProcessor(BaseEstimator, TransformerMixin):
54
57
  self.is_fitted = True
55
58
 
56
59
  def transform(self, X: np.array):
57
- """Genera un array con los tiempos de operación, caminata y pico abierto."""
60
+ """Genera un array con los tiempos de operación, caminata, pico abierto y ratio_dCdP.
61
+ Args:
62
+ - X es un array de strings de forma (n, 2) donde la primera columna es el tiempo y la segunda columna es el tiempo de pico abierto (en segundos).
63
+ """
58
64
 
59
65
  if not self.is_fitted:
60
66
  raise RuntimeError("El modelo no ha sido fitteado.")
@@ -100,27 +106,26 @@ class TimeSeriesProcessor(BaseEstimator, TransformerMixin):
100
106
  return self._dataPositions
101
107
 
102
108
  if __name__ == "__main__":
103
- timestamps = np.array([1697724423, 1697724428, 1697724430, 1697724433])
104
- tlm_data = np.array(["0010001000001100110000001100001000000000000000001111111000110000",
105
- "0010001000001100110000101100000000000000000000001111111000110000",
106
- "0010001000001100101100101100000000000000000000001111111000110000",
107
- "0010001000001100101100001100000000000000000000001111111000110000"])
108
-
109
- ## pasamos los timestamps a fecha usando datetime
110
- import datetime
111
- fechas = np.array([datetime.datetime.fromtimestamp(ts) for ts in timestamps])
112
- print(fechas)
113
-
114
- from sarapy.dataProcessing import TLMSensorDataExtractor
115
- tlm_extractor = TLMSensorDataExtractor()
109
+
110
+ import pandas as pd
111
+ import numpy as np
112
+ import os
113
+ path = os.path.join(os.getcwd(), "examples\\volcado_17112023_NODE_processed.csv")
114
+ raw_data = pd.read_csv(path, sep=";", ).to_numpy()
115
+ timestamps = raw_data[50:60,3].astype(float)
116
+ tlm_data = raw_data[50:60,2]
117
+
118
+ from sarapy.dataProcessing import TLMSensorDataProcessor
119
+ tlm_extractor = TLMSensorDataProcessor.TLMSensorDataProcessor()
116
120
  tlm_extractor.fit(tlm_data)
117
121
 
118
- deltaPicos = tlm_extractor.TIMEAC
122
+ deltaPicos = tlm_extractor.TIMEAC.astype(float)
119
123
 
120
124
  tmsp = TimeSeriesProcessor()
121
125
 
122
126
  #creamos un array con los timestamps y los tiempos de pico abierto de la forma (n, 2)
123
127
  X = np.hstack((timestamps.reshape(-1, 1), deltaPicos.reshape(-1, 1)))
128
+
124
129
  tmsp.fit(X)
125
130
  tmsp.transform(X)
126
131
  tmsp.fit_transform(X)
@@ -131,7 +136,7 @@ if __name__ == "__main__":
131
136
  timestamps2 = np.array([1697724423])
132
137
 
133
138
  tmsp2 = TimeSeriesProcessor()
134
- tlm_extractor2 = TLMSensorDataExtractor()
139
+ tlm_extractor2 = TLMSensorDataProcessor.TLMSensorDataProcessor()
135
140
 
136
141
  tlm_extractor2.fit(tlm_data2)
137
142
 
@@ -0,0 +1,4 @@
1
+ # from .TLMSensorDataProcessor import TLMSensorDataProcessor
2
+ # from .GeoProcessor import GeoProcessor
3
+ # from .TimeSeriesProcessor import TimeSeriesProcessor
4
+ # from .OpsProcessor import OpsProcessor
@@ -0,0 +1,58 @@
1
+ ###Documentación en https://github.com/lucasbaldezzari/sarapy/blob/main/docs/Docs.md
2
+ import numpy as np
3
+ from sklearn.base import BaseEstimator, TransformerMixin
4
+ from sklearn.pipeline import Pipeline
5
+ from sarapy.mlProcessors import PlantinFMCreator
6
+
7
+ class PlantinClassifier(BaseEstimator, TransformerMixin):
8
+ """Clase para implementar el pipeline de procesamiento de datos para la clasificación del tipo de operación para plantines."""
9
+
10
+ def __init__(self):
11
+ """Constructor de la clase PlantinClassifier."""
12
+
13
+ self._plantinFMCreator = PlantinFMCreator.PlantinFMCreator()
14
+
15
+ self._pipeline = Pipeline([
16
+ ("FMCreator", self._plantinFMCreator),
17
+ ])
18
+
19
+ def classify(self, newData):
20
+ """Genera la clasificación de las operaciones para plantines.
21
+
22
+ newData: Es un array con los datos (strings) provenientes de la base de datos histórica. La forma de newData debe ser (n,4). Las columnas de newData deben ser,
23
+ - 0: tlm_spbb son los datos de telemetría.
24
+ - 1: date_oprc son los datos de fecha y hora de operación.
25
+ - 2: latitud de la operación
26
+ - 3: longitud de la operación
27
+ - 4: precision del GPS
28
+ """
29
+
30
+ return self._pipeline.fit_transform(newData).round(2)
31
+
32
+ if __name__ == "__main__":
33
+ from sarapy.dataProcessing import OpsProcessor
34
+
35
+ #cargo archivo examples\volcado_17112023_NODE_processed.csv
36
+ import pandas as pd
37
+ import os
38
+ path = os.path.join(os.getcwd(), "examples\\volcado_17112023_NODE_processed.csv")
39
+ data_df = pd.read_csv(path, sep=";", )
40
+ raw_data = data_df.to_numpy().astype(str)
41
+
42
+ ##tomo raw_data y obtengo muestras de entre 7 a 15 filas una detrás de la otra. El valor de entre 7 y 15 es aleatorio.
43
+ sample = []
44
+ index = 0
45
+ while True:
46
+ random_value = np.random.randint(8, 15)
47
+ if index + random_value < len(raw_data):
48
+ sample.append(raw_data[index:index+random_value])
49
+ else:
50
+ break
51
+ index += random_value
52
+
53
+ op = OpsProcessor.OpsProcessor()
54
+ ##actualizo el diccionario de operaciones
55
+ op.updateOperationsDict(sample[12])
56
+ op.operationsDict
57
+ plantin_classifier = PlantinClassifier()
58
+ plantin_classifier.classify(op.operationsDict["1"]["sample_ops"])
@@ -1,9 +1,9 @@
1
1
  ###Documentación en https://github.com/lucasbaldezzari/sarapy/blob/main/docs/Docs.md
2
2
 
3
+ import warnings
3
4
  import numpy as np
4
5
  from sklearn.base import BaseEstimator, TransformerMixin
5
- import warnings
6
- from sarapy.dataProcessing import TLMSensorDataExtractor, TimeSeriesProcessor, GeoProcessor
6
+ from sarapy.dataProcessing import TLMSensorDataProcessor, TimeSeriesProcessor, GeoProcessor
7
7
  from sarapy.preprocessing import DistancesImputer
8
8
 
9
9
  class PlantinFMCreator(BaseEstimator, TransformerMixin):
@@ -48,7 +48,7 @@ class PlantinFMCreator(BaseEstimator, TransformerMixin):
48
48
  """Fittea el objeto
49
49
 
50
50
  Params:
51
- - X: Es un array con los datos provenientes (strings) de la base de datos histórica. La forma de X es (n,4)Las columnas de X son,
51
+ - X: Es un array con los datos provenientes (strings) de la base de datos histórica. La forma de X es (n,5)Las columnas de X son,
52
52
  - 0: tlm_spbb son los datos de telemetría.
53
53
  - 1: date_oprc son los datos de fecha y hora de operación.
54
54
  - 2: latitud de la operación
@@ -65,9 +65,9 @@ class PlantinFMCreator(BaseEstimator, TransformerMixin):
65
65
  precitions = X[:,4].astype(float) #precision del GPS
66
66
 
67
67
  ##instanciamos los objetos
68
- tlmDataExtractor = TLMSensorDataExtractor()
69
- timeProcessor = TimeSeriesProcessor()
70
- geoprocessor = GeoProcessor()
68
+ tlmDataExtractor = TLMSensorDataProcessor.TLMSensorDataProcessor()
69
+ timeProcessor = TimeSeriesProcessor.TimeSeriesProcessor()
70
+ geoprocessor = GeoProcessor.GeoProcessor()
71
71
 
72
72
  ##***** OBTENEMOS LOS DATOS PARA FITEAR LOS OBJETOS Y ASÍ PROCESAR LA FM *****
73
73
  ##obtengo las posiciones de los datos de tlmDataExtractor y timeProcessor
@@ -88,11 +88,12 @@ class PlantinFMCreator(BaseEstimator, TransformerMixin):
88
88
 
89
89
  ####***** IMPUTAMOS DATOS SI ES LO REQUERIDO*****
90
90
  if self.imputeDistances:
91
- distanceimputer = DistancesImputer(distanciaMedia = self.distanciaMedia,
92
- umbral_precision = self.umbral_precision,
93
- dist_mismo_lugar = self.dist_mismo_lugar, max_dist = self.max_dist,
94
- umbral_ratio_dCdP = self.umbral_ratio_dCdP,
95
- deltaO_medio = self.deltaO_medio, keepDims = False, columnToImpute = 0)
91
+ distanceimputer = DistancesImputer.DistancesImputer(distanciaMedia = self.distanciaMedia,
92
+ umbral_precision = self.umbral_precision,
93
+ dist_mismo_lugar = self.dist_mismo_lugar,
94
+ max_dist = self.max_dist,
95
+ umbral_ratio_dCdP = self.umbral_ratio_dCdP,
96
+ deltaO_medio = self.deltaO_medio, keepDims = False, columnToImpute = 0)
96
97
 
97
98
  X_distance_imputation = np.hstack((self._distances.reshape(-1, 1),
98
99
  precitions.reshape(-1, 1),
@@ -109,18 +110,19 @@ class PlantinFMCreator(BaseEstimator, TransformerMixin):
109
110
  """Transforma los datos de X en la matriz de características.
110
111
 
111
112
  Params:
112
- - X: Es un array con los datos provenientes (strings) de la base de datos histórica. La forma de X es (n,4)Las columnas de X son,
113
+ - X: Es un array con los datos provenientes (strings) de la base de datos histórica. La forma de X es (n,5)Las columnas de X son,
113
114
  - 0: tlm_spbb son los datos de telemetría.
114
115
  - 1: date_oprc son los datos de fecha y hora de operación.
115
116
  - 2: latitud de la operación
116
117
  - 3: longitud de la operación
118
+ - 4: precision del GPS
117
119
 
118
120
  Returns:
119
121
  - featureMatrix: Es un array con la matriz de características. La forma de featureMatrix es (n,5). Las columnas de featureMatrix son,
120
122
  - 0: DST_PT: Distorsión de plantín
121
- - 2: deltaO: delta operación
122
- - 3: ratio_dCdP: Ratio entre el delta de caminata y delta de pico abierto
123
- - 4: distances: Distancias entre operaciones
123
+ - 1: deltaO: delta operación
124
+ - 2: ratio_dCdP: Ratio entre el delta de caminata y delta de pico abierto
125
+ - 3: distances: Distancias entre operaciones
124
126
  """
125
127
 
126
128
  if not self.is_fitted:
@@ -138,18 +140,19 @@ class PlantinFMCreator(BaseEstimator, TransformerMixin):
138
140
  """Fittea y transforma los datos de X en la matriz de características.
139
141
 
140
142
  Params:
141
- - X: Es un array con los datos provenientes (strings) de la base de datos histórica. La forma de X es (n,4)Las columnas de X son,
143
+ - X: Es un array con los datos provenientes (strings) de la base de datos histórica. La forma de X es (n,5)Las columnas de X son,
142
144
  - 0: tlm_spbb son los datos de telemetría.
143
145
  - 1: date_oprc son los datos de fecha y hora de operación.
144
146
  - 2: latitud de la operación
145
147
  - 3: longitud de la operación
146
-
148
+ - 4: precision del GPS
149
+
147
150
  Returns:
148
151
  - featureMatrix: Es un array con la matriz de características. La forma de featureMatrix es (n,5). Las columnas de featureMatrix son,
149
152
  - 0: DST_PT: Distorsión de plantín
150
- - 2: deltaO: delta operación
151
- - 3: ratio_dCdP: Ratio entre el delta de caminata y delta de pico abierto
152
- - 4: distances: Distancias entre operaciones
153
+ - 1: deltaO: delta operación
154
+ - 2: ratio_dCdP: Ratio entre el delta de caminata y delta de pico abierto
155
+ - 3: distances: Distancias entre operaciones
153
156
  """
154
157
  self.fit(X)
155
158
  return self.transform(X)
@@ -177,23 +180,13 @@ class PlantinFMCreator(BaseEstimator, TransformerMixin):
177
180
 
178
181
  if __name__ == "__main__":
179
182
  ##genero objeto FMCreator
180
- fmcreator = PlantinFMCreator(imputeDistances=True)
181
-
182
- ##datos de ejemplo
183
- tlmsbp_sample = np.array(['0010001000010010110000011000000111111101001000000000000000000000',
184
- '0010001000010100110000011000000111111101001000000000000000000000',
185
- '0010001000010000110000011000000111111101001000000000000000000000',
186
- '0010001000011010110000011000110111111101001000000000000000000000'])
187
-
188
- date_oprc = ["35235", "35240", "35244", "35248"]
189
- lats = ["-32.331093", "-32.331116", "-32.331131", "-32.331146"]
190
- lons = ["-57.229733", "-57.229733", "-57.229733", "-57.22974"]
191
- precitions = ["1", "0.12", "0.1", "1"]
192
-
193
- ##generamos matriz de datos X
194
- ##generamos matriz de datos X de tal forma que cada columna tenga los datos de tlmsbp_sample, date_oprc, lats y lons
195
- X = np.vstack((tlmsbp_sample, date_oprc, lats, lons,precitions)).T
196
- X = X.astype(str)
183
+ fmcreator = PlantinFMCreator(imputeDistances=False)
184
+ import pandas as pd
185
+ import os
186
+ path = os.path.join(os.getcwd(), "examples\\volcado_17112023_NODE_processed.csv")
187
+ raw_data = pd.read_csv(path, sep=";", ).to_numpy()
188
+
189
+ X = raw_data[50:60,2:]
197
190
  fmcreator.fit(X)
198
191
  fm = fmcreator.fit_transform(X)
199
192
  print(fm)
File without changes
@@ -2,7 +2,6 @@
2
2
 
3
3
  import numpy as np
4
4
  from sklearn.base import BaseEstimator, TransformerMixin
5
- from sarapy.dataProcessing import TLMSensorDataExtractor, TimeSeriesProcessor, GeoProcessor
6
5
 
7
6
  class DistancesImputer(BaseEstimator, TransformerMixin):
8
7
  """La clase DistancesImputer 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.
@@ -153,9 +152,11 @@ class DistancesImputer(BaseEstimator, TransformerMixin):
153
152
 
154
153
 
155
154
  if __name__ == "__main__":
156
- tlmda = TLMSensorDataExtractor()
157
- tsa = TimeSeriesProcessor()
158
- gpa = GeoProcessor()
155
+ from sarapy.dataProcessing import TimeSeriesProcessor, GeoProcessor
156
+ from sarapy.dataProcessing import TLMSensorDataProcessor
157
+ tlmda = TLMSensorDataProcessor.TLMSensorDataProcessor()
158
+ tsa = TimeSeriesProcessor.TimeSeriesProcessor()
159
+ gpa = GeoProcessor.GeoProcessor()
159
160
 
160
161
  ##datos de ejemplo
161
162
  tlmsbp_sample = np.array(['0010001000010010110000011000000111111101001000000000000000000000',
@@ -0,0 +1,34 @@
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
+
6
+ class FertilizerImputer(BaseEstimator, TransformerMixin):
7
+ """Clase para imputar los datos de fertilizante.
8
+
9
+ La idea principal es poder relevar la presencia o no de Fertilizante en la operación."""
10
+
11
+ def __init__(self, n_next_ops, min_dist_level = 3, keepDims = False, columnToImpute = 0):
12
+ """Constructor de la clase FertilizerImputer.
13
+
14
+ Args:
15
+ - n_prev_ops: Número de operaciones siguientes a considerar.
16
+ - min_dist_level: Nivel mínimo de distorsión para considerar que hay fertilizante.
17
+ - columnToImpute: Columna a imputar.
18
+ - keepDims: Si es True, se mantienen las dimensiones del array de entrada. Si es False, se devuelve un array de una dimensión.
19
+ """
20
+ self.n_next_ops = n_next_ops
21
+ self.min_dist_level = min_dist_level
22
+ self._keepDims = keepDims
23
+ self._columnToImpute = columnToImpute
24
+ self.is_fitted = False
25
+ self._dataPositions = {"fertilizante":0}
26
+
27
+ def fit(self, X:np.array, y = None):
28
+ """Fittea el objeto
29
+
30
+ Params:
31
+ - X: Es un array con los datos provenientes (strings) de la base de datos histórica. La forma de X es (n,1)
32
+ - 0: Fertilizante
33
+ """
34
+ self._fertilizante = X[:,0]
@@ -0,0 +1,2 @@
1
+ # from .DistancesImputer import DistancesImputer
2
+ # from .FertilizerImputer import FertilizerImputer
@@ -1,2 +1,2 @@
1
1
  ## Version of the package
2
- __version__ = "0.3.10"
2
+ __version__ = "0.4.1"
@@ -0,0 +1,31 @@
1
+ Metadata-Version: 2.1
2
+ Name: sarapy
3
+ Version: 0.4.1
4
+ Home-page: https://github.com/lucasbaldezzari/sarapy
5
+ Author: Lucas Baldezzari
6
+ Author-email: Lucas Baldezzari <lmbaldezzari@gmail.com>
7
+ Maintainer-email: Lucas Baldezzari <lmbaldezzari@gmail.com>
8
+ License: Your license text goes here
9
+ Description-Content-Type: text/markdown
10
+ Requires-Dist: numpy
11
+ Requires-Dist: matplotlib
12
+ Requires-Dist: pandas
13
+ Requires-Dist: scipy
14
+ Requires-Dist: scikit-learn
15
+ Requires-Dist: geopy
16
+
17
+ # SARAPY
18
+
19
+ Library for processing SARAPICO project metadata of _AMG_.
20
+
21
+ #### Version 0.4.1 (working)
22
+
23
+ - Se corrigen problemas de importaciones circulares.
24
+
25
+ #### Version 0.4.0
26
+
27
+ - Se implementa _OpsProcessor_.
28
+ - Se implementa _PlanntinClassifier_.
29
+ - Se corrige salida de _transform()_ y _fit_transform()_ de GeoProcessor.
30
+ - Se mueve PlantinFMCreator a mlProcessors
31
+ - Se cambia nombre de TLMSensorDataCreator a TLMSensorDataProcessor
@@ -9,9 +9,13 @@ sarapy.egg-info/dependency_links.txt
9
9
  sarapy.egg-info/requires.txt
10
10
  sarapy.egg-info/top_level.txt
11
11
  sarapy/dataProcessing/GeoProcessor.py
12
- sarapy/dataProcessing/PlantinFMCreator.py
13
- sarapy/dataProcessing/TLMSensorDataExtractor.py
12
+ sarapy/dataProcessing/OpsProcessor.py
13
+ sarapy/dataProcessing/TLMSensorDataProcessor.py
14
14
  sarapy/dataProcessing/TimeSeriesProcessor.py
15
15
  sarapy/dataProcessing/__init__.py
16
+ sarapy/mlProcessors/PlantinClassifier.py
17
+ sarapy/mlProcessors/PlantinFMCreator.py
18
+ sarapy/mlProcessors/__init__.py
16
19
  sarapy/preprocessing/DistancesImputer.py
20
+ sarapy/preprocessing/FertilizerImputer.py
17
21
  sarapy/preprocessing/__init__.py
@@ -1,5 +1,5 @@
1
1
  from setuptools import setup, find_packages
2
- import os, toml
2
+ import toml
3
3
 
4
4
  def getRequirements():
5
5
  with open('requirements.txt', 'r') as f:
sarapy-0.3.10/PKG-INFO DELETED
@@ -1,124 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: sarapy
3
- Version: 0.3.10
4
- Summary: Library for Sarapico Metadata processing
5
- Home-page: https://github.com/lucasbaldezzari/sarapy
6
- Author: Lucas Baldezzari
7
- Author-email: Lucas Baldezzari <lmbaldezzari@gmail.com>
8
- Maintainer-email: Lucas Baldezzari <lmbaldezzari@gmail.com>
9
- License: MIT
10
- Classifier: License :: OSI Approved :: MIT License
11
- Classifier: Programming Language :: Python :: 3
12
- Classifier: Operating System :: Microsoft :: Windows :: Windows 10
13
- Classifier: Operating System :: Microsoft :: Windows :: Windows 11
14
- Classifier: Operating System :: Unix
15
- Description-Content-Type: text/markdown
16
- Requires-Dist: numpy
17
- Requires-Dist: matplotlib
18
- Requires-Dist: pandas
19
- Requires-Dist: scipy
20
- Requires-Dist: scikit-learn
21
- Requires-Dist: geopy
22
-
23
- # SARAPY
24
-
25
- Library for processing SARAPICO project metadata of _AMG_.
26
-
27
- #### Version 0.3.10
28
-
29
- - Se corrige línea en DistancesImputer.
30
-
31
- #### Version 0.3.9
32
-
33
- - Se corrige nombre de argumento en el constructor de PlantinFMCreator
34
-
35
- #### Version 0.3.8
36
-
37
- - Se agregan condiciones para mejorar la imputación de distancias en _DistancesImputer_.
38
-
39
- #### Version 0.3.7
40
-
41
- - Se implementa la imputación de distancias con _DistancesImputer_ dentro de PlantinFMCreator.
42
- - Se agregan argumentos al constructor de _PlantinFMCreator_ necesarios para poder imputar con _DistancesImputer_.
43
- - Se agrega argumento dist*mismo_lugar en \_DistancesImputer* para usar dicho valor en las imputaciones que correspondan a operaciones en el mismo lugar.
44
-
45
- #### Version 0.3.6
46
-
47
- - Se agregan argumentos al constructor de _DistancesImputer_ para que Transform y fit_transform puedan entregar un array de shape (n,1) o bien de (n,6) eligiendo la columna a imputar.
48
-
49
- #### Version 0.3.5
50
-
51
- - Se implementa clase _DistancesImputer_.
52
-
53
- #### Version 0.3.4
54
-
55
- - Se actializa _dataPositions_ de PlantinFMCreator.
56
-
57
- #### Version 0.3.3
58
-
59
- - Se cambia el nombre de la clase FMCreator a PlantinFMCreator. Se modifica la matriz transformada quitando el dato de distorsión de Fertilizante.
60
-
61
- #### Version 0.3.2
62
-
63
- - Se agrega property en FMCreator para acceder a \_dataPosition. Se cambia la forma de los diccionarios de _dataPosition_ de FMCreator, TimeSeriesProcesor y TLMSensorDataExtractor. Además, ahora este atributo se crea en init().
64
- - Se corrige bug por división por cero en el cálculo de _ratio_dCdP_ de TimeSeriesProcessor.
65
-
66
- #### Version 0.3.1
67
-
68
- - Se corrige forma de acceder a los datos de X en FMCreator.fit().
69
-
70
- #### Version 0.3.0
71
-
72
- - Se implementa clase FMCreator.
73
- - Se quita método TLMSensorDataExtractor.getMetadataRevisionNumber().
74
- - Se agrega cálculo de ratio_dCdP en TimeSeriesProcessor
75
- - Se cambia nombre de clase _GeoAnalyzer_ por _GeoProcessor_
76
- - Se agrega atritubo dataPositions en _TLMSensorDataExtractor_ para poder saber qué representa cada columna dentro del array devuelto por tranform.
77
- - Se agrega dataPositions a TimeSeriesProcessor
78
-
79
- #### Version 0.2.6
80
-
81
- - Se cambia la forma de computar los deltaO de TimeSeriesProcessor. Ahora se hace deltaO*i = T_i - T*(i-1)
82
-
83
- #### Version 0.2.5
84
-
85
- - Se corrige GeoAnalyzer.transform() para que entregue el array con un cero adicional al final ya que estaba entregando _(n-1,2)_ datos cuando X es de shape (n,2).
86
-
87
- #### Version 0.2.4
88
-
89
- - Se corrige nombre de atributos de TLMSensorDataExtractor
90
-
91
- #### Version 0.2.3
92
-
93
- - Se modifican métodos _TLMSensorDataExtractor.fit()_ y _TLMSensorDataExtractor.transofmr()_ ya que no se habían considerado los datos de FIX y SIV de la metadata.
94
-
95
- #### Version 0.2.2
96
-
97
- - Se quita el chequeo de valores nulos en TimeSeriesProcessor.fit()
98
- - Si la cantidad de filas de X que se pasa a TimeSeriesProcessor.fit() es igual a uno, los tiempos de operación y de caminata se hacen cero. El método transform devolverá un array de (1,3) donde el único valor diferente de cero será el deltaC.
99
-
100
- #### Version 0.2.1
101
-
102
- - Se corrige _init.py_ de dataProcessing.
103
-
104
- #### Version 0.2.0
105
-
106
- - Transforming some attributs to private attributes. Adding @property for getters.
107
- - Created GNSSDataProcessor class.
108
- - Created TimeSeriesProcessor class.
109
-
110
- #### Version 0.1.4
111
-
112
- Setting an **init**.py file for TLMSensorDataExtractor module.
113
-
114
- #### Version 0.1.3
115
-
116
- Setting version.py file.
117
-
118
- #### Version 0.1.1 and Version 0.1.0
119
-
120
- Just for testing.
121
-
122
- ### Docs
123
-
124
- Documentation [here](https://github.com/lucasbaldezzari/sarapy/blob/main/docs/Docs.md).
sarapy-0.3.10/README.md DELETED
@@ -1,102 +0,0 @@
1
- # SARAPY
2
-
3
- Library for processing SARAPICO project metadata of _AMG_.
4
-
5
- #### Version 0.3.10
6
-
7
- - Se corrige línea en DistancesImputer.
8
-
9
- #### Version 0.3.9
10
-
11
- - Se corrige nombre de argumento en el constructor de PlantinFMCreator
12
-
13
- #### Version 0.3.8
14
-
15
- - Se agregan condiciones para mejorar la imputación de distancias en _DistancesImputer_.
16
-
17
- #### Version 0.3.7
18
-
19
- - Se implementa la imputación de distancias con _DistancesImputer_ dentro de PlantinFMCreator.
20
- - Se agregan argumentos al constructor de _PlantinFMCreator_ necesarios para poder imputar con _DistancesImputer_.
21
- - Se agrega argumento dist*mismo_lugar en \_DistancesImputer* para usar dicho valor en las imputaciones que correspondan a operaciones en el mismo lugar.
22
-
23
- #### Version 0.3.6
24
-
25
- - Se agregan argumentos al constructor de _DistancesImputer_ para que Transform y fit_transform puedan entregar un array de shape (n,1) o bien de (n,6) eligiendo la columna a imputar.
26
-
27
- #### Version 0.3.5
28
-
29
- - Se implementa clase _DistancesImputer_.
30
-
31
- #### Version 0.3.4
32
-
33
- - Se actializa _dataPositions_ de PlantinFMCreator.
34
-
35
- #### Version 0.3.3
36
-
37
- - Se cambia el nombre de la clase FMCreator a PlantinFMCreator. Se modifica la matriz transformada quitando el dato de distorsión de Fertilizante.
38
-
39
- #### Version 0.3.2
40
-
41
- - Se agrega property en FMCreator para acceder a \_dataPosition. Se cambia la forma de los diccionarios de _dataPosition_ de FMCreator, TimeSeriesProcesor y TLMSensorDataExtractor. Además, ahora este atributo se crea en init().
42
- - Se corrige bug por división por cero en el cálculo de _ratio_dCdP_ de TimeSeriesProcessor.
43
-
44
- #### Version 0.3.1
45
-
46
- - Se corrige forma de acceder a los datos de X en FMCreator.fit().
47
-
48
- #### Version 0.3.0
49
-
50
- - Se implementa clase FMCreator.
51
- - Se quita método TLMSensorDataExtractor.getMetadataRevisionNumber().
52
- - Se agrega cálculo de ratio_dCdP en TimeSeriesProcessor
53
- - Se cambia nombre de clase _GeoAnalyzer_ por _GeoProcessor_
54
- - Se agrega atritubo dataPositions en _TLMSensorDataExtractor_ para poder saber qué representa cada columna dentro del array devuelto por tranform.
55
- - Se agrega dataPositions a TimeSeriesProcessor
56
-
57
- #### Version 0.2.6
58
-
59
- - Se cambia la forma de computar los deltaO de TimeSeriesProcessor. Ahora se hace deltaO*i = T_i - T*(i-1)
60
-
61
- #### Version 0.2.5
62
-
63
- - Se corrige GeoAnalyzer.transform() para que entregue el array con un cero adicional al final ya que estaba entregando _(n-1,2)_ datos cuando X es de shape (n,2).
64
-
65
- #### Version 0.2.4
66
-
67
- - Se corrige nombre de atributos de TLMSensorDataExtractor
68
-
69
- #### Version 0.2.3
70
-
71
- - Se modifican métodos _TLMSensorDataExtractor.fit()_ y _TLMSensorDataExtractor.transofmr()_ ya que no se habían considerado los datos de FIX y SIV de la metadata.
72
-
73
- #### Version 0.2.2
74
-
75
- - Se quita el chequeo de valores nulos en TimeSeriesProcessor.fit()
76
- - Si la cantidad de filas de X que se pasa a TimeSeriesProcessor.fit() es igual a uno, los tiempos de operación y de caminata se hacen cero. El método transform devolverá un array de (1,3) donde el único valor diferente de cero será el deltaC.
77
-
78
- #### Version 0.2.1
79
-
80
- - Se corrige _init.py_ de dataProcessing.
81
-
82
- #### Version 0.2.0
83
-
84
- - Transforming some attributs to private attributes. Adding @property for getters.
85
- - Created GNSSDataProcessor class.
86
- - Created TimeSeriesProcessor class.
87
-
88
- #### Version 0.1.4
89
-
90
- Setting an **init**.py file for TLMSensorDataExtractor module.
91
-
92
- #### Version 0.1.3
93
-
94
- Setting version.py file.
95
-
96
- #### Version 0.1.1 and Version 0.1.0
97
-
98
- Just for testing.
99
-
100
- ### Docs
101
-
102
- Documentation [here](https://github.com/lucasbaldezzari/sarapy/blob/main/docs/Docs.md).
@@ -1,4 +0,0 @@
1
- from .TLMSensorDataExtractor import TLMSensorDataExtractor
2
- from .GeoProcessor import GeoProcessor
3
- from .TimeSeriesProcessor import TimeSeriesProcessor
4
- from .PlantinFMCreator import PlantinFMCreator
@@ -1 +0,0 @@
1
- from .DistancesImputer import DistancesImputer
@@ -1,124 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: sarapy
3
- Version: 0.3.10
4
- Summary: Library for Sarapico Metadata processing
5
- Home-page: https://github.com/lucasbaldezzari/sarapy
6
- Author: Lucas Baldezzari
7
- Author-email: Lucas Baldezzari <lmbaldezzari@gmail.com>
8
- Maintainer-email: Lucas Baldezzari <lmbaldezzari@gmail.com>
9
- License: MIT
10
- Classifier: License :: OSI Approved :: MIT License
11
- Classifier: Programming Language :: Python :: 3
12
- Classifier: Operating System :: Microsoft :: Windows :: Windows 10
13
- Classifier: Operating System :: Microsoft :: Windows :: Windows 11
14
- Classifier: Operating System :: Unix
15
- Description-Content-Type: text/markdown
16
- Requires-Dist: numpy
17
- Requires-Dist: matplotlib
18
- Requires-Dist: pandas
19
- Requires-Dist: scipy
20
- Requires-Dist: scikit-learn
21
- Requires-Dist: geopy
22
-
23
- # SARAPY
24
-
25
- Library for processing SARAPICO project metadata of _AMG_.
26
-
27
- #### Version 0.3.10
28
-
29
- - Se corrige línea en DistancesImputer.
30
-
31
- #### Version 0.3.9
32
-
33
- - Se corrige nombre de argumento en el constructor de PlantinFMCreator
34
-
35
- #### Version 0.3.8
36
-
37
- - Se agregan condiciones para mejorar la imputación de distancias en _DistancesImputer_.
38
-
39
- #### Version 0.3.7
40
-
41
- - Se implementa la imputación de distancias con _DistancesImputer_ dentro de PlantinFMCreator.
42
- - Se agregan argumentos al constructor de _PlantinFMCreator_ necesarios para poder imputar con _DistancesImputer_.
43
- - Se agrega argumento dist*mismo_lugar en \_DistancesImputer* para usar dicho valor en las imputaciones que correspondan a operaciones en el mismo lugar.
44
-
45
- #### Version 0.3.6
46
-
47
- - Se agregan argumentos al constructor de _DistancesImputer_ para que Transform y fit_transform puedan entregar un array de shape (n,1) o bien de (n,6) eligiendo la columna a imputar.
48
-
49
- #### Version 0.3.5
50
-
51
- - Se implementa clase _DistancesImputer_.
52
-
53
- #### Version 0.3.4
54
-
55
- - Se actializa _dataPositions_ de PlantinFMCreator.
56
-
57
- #### Version 0.3.3
58
-
59
- - Se cambia el nombre de la clase FMCreator a PlantinFMCreator. Se modifica la matriz transformada quitando el dato de distorsión de Fertilizante.
60
-
61
- #### Version 0.3.2
62
-
63
- - Se agrega property en FMCreator para acceder a \_dataPosition. Se cambia la forma de los diccionarios de _dataPosition_ de FMCreator, TimeSeriesProcesor y TLMSensorDataExtractor. Además, ahora este atributo se crea en init().
64
- - Se corrige bug por división por cero en el cálculo de _ratio_dCdP_ de TimeSeriesProcessor.
65
-
66
- #### Version 0.3.1
67
-
68
- - Se corrige forma de acceder a los datos de X en FMCreator.fit().
69
-
70
- #### Version 0.3.0
71
-
72
- - Se implementa clase FMCreator.
73
- - Se quita método TLMSensorDataExtractor.getMetadataRevisionNumber().
74
- - Se agrega cálculo de ratio_dCdP en TimeSeriesProcessor
75
- - Se cambia nombre de clase _GeoAnalyzer_ por _GeoProcessor_
76
- - Se agrega atritubo dataPositions en _TLMSensorDataExtractor_ para poder saber qué representa cada columna dentro del array devuelto por tranform.
77
- - Se agrega dataPositions a TimeSeriesProcessor
78
-
79
- #### Version 0.2.6
80
-
81
- - Se cambia la forma de computar los deltaO de TimeSeriesProcessor. Ahora se hace deltaO*i = T_i - T*(i-1)
82
-
83
- #### Version 0.2.5
84
-
85
- - Se corrige GeoAnalyzer.transform() para que entregue el array con un cero adicional al final ya que estaba entregando _(n-1,2)_ datos cuando X es de shape (n,2).
86
-
87
- #### Version 0.2.4
88
-
89
- - Se corrige nombre de atributos de TLMSensorDataExtractor
90
-
91
- #### Version 0.2.3
92
-
93
- - Se modifican métodos _TLMSensorDataExtractor.fit()_ y _TLMSensorDataExtractor.transofmr()_ ya que no se habían considerado los datos de FIX y SIV de la metadata.
94
-
95
- #### Version 0.2.2
96
-
97
- - Se quita el chequeo de valores nulos en TimeSeriesProcessor.fit()
98
- - Si la cantidad de filas de X que se pasa a TimeSeriesProcessor.fit() es igual a uno, los tiempos de operación y de caminata se hacen cero. El método transform devolverá un array de (1,3) donde el único valor diferente de cero será el deltaC.
99
-
100
- #### Version 0.2.1
101
-
102
- - Se corrige _init.py_ de dataProcessing.
103
-
104
- #### Version 0.2.0
105
-
106
- - Transforming some attributs to private attributes. Adding @property for getters.
107
- - Created GNSSDataProcessor class.
108
- - Created TimeSeriesProcessor class.
109
-
110
- #### Version 0.1.4
111
-
112
- Setting an **init**.py file for TLMSensorDataExtractor module.
113
-
114
- #### Version 0.1.3
115
-
116
- Setting version.py file.
117
-
118
- #### Version 0.1.1 and Version 0.1.0
119
-
120
- Just for testing.
121
-
122
- ### Docs
123
-
124
- Documentation [here](https://github.com/lucasbaldezzari/sarapy/blob/main/docs/Docs.md).
File without changes
File without changes