sarapy 0.4.4__tar.gz → 0.4.6__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 (23) hide show
  1. {sarapy-0.4.4 → sarapy-0.4.6}/PKG-INFO +10 -1
  2. {sarapy-0.4.4 → sarapy-0.4.6}/README.md +9 -0
  3. {sarapy-0.4.4 → sarapy-0.4.6}/pyproject.toml +1 -1
  4. {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/dataProcessing/OpsProcessor.py +131 -106
  5. {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/mlProcessors/PlantinClassifier.py +17 -14
  6. {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/version.py +1 -1
  7. {sarapy-0.4.4 → sarapy-0.4.6}/sarapy.egg-info/PKG-INFO +10 -1
  8. {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/__init__.py +0 -0
  9. {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/dataProcessing/GeoProcessor.py +0 -0
  10. {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/dataProcessing/TLMSensorDataProcessor.py +0 -0
  11. {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/dataProcessing/TimeSeriesProcessor.py +0 -0
  12. {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/dataProcessing/__init__.py +0 -0
  13. {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/mlProcessors/PlantinFMCreator.py +0 -0
  14. {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/mlProcessors/__init__.py +0 -0
  15. {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/preprocessing/DistancesImputer.py +0 -0
  16. {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/preprocessing/FertilizerImputer.py +0 -0
  17. {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/preprocessing/__init__.py +0 -0
  18. {sarapy-0.4.4 → sarapy-0.4.6}/sarapy.egg-info/SOURCES.txt +0 -0
  19. {sarapy-0.4.4 → sarapy-0.4.6}/sarapy.egg-info/dependency_links.txt +0 -0
  20. {sarapy-0.4.4 → sarapy-0.4.6}/sarapy.egg-info/requires.txt +0 -0
  21. {sarapy-0.4.4 → sarapy-0.4.6}/sarapy.egg-info/top_level.txt +0 -0
  22. {sarapy-0.4.4 → sarapy-0.4.6}/setup.cfg +0 -0
  23. {sarapy-0.4.4 → sarapy-0.4.6}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sarapy
3
- Version: 0.4.4
3
+ Version: 0.4.6
4
4
  Home-page: https://github.com/lucasbaldezzari/sarapy
5
5
  Author: Lucas Baldezzari
6
6
  Author-email: Lucas Baldezzari <lmbaldezzari@gmail.com>
@@ -18,6 +18,15 @@ Requires-Dist: geopy
18
18
 
19
19
  Library for processing SARAPICO project metadata of _AMG_.
20
20
 
21
+ #### Version 0.4.6
22
+
23
+ - Se agrega función OpsProcessor.transformInputData() para convertir la lista de diccionarios entregadas por el decoder a un array de strings necesarios para procesar y clasificar los datos.
24
+
25
+ #### Version 0.4.5
26
+
27
+ - Se modifica clase PlantinClassifier para que ahora tome un clasificador y lo use para clasificar operaciones.
28
+ - Se modifica OpsProcessor para poder obtener clasificaciones (y no matrices de características de plantin como se venía probando).
29
+
21
30
  #### Version 0.4.4
22
31
 
23
32
  - Se modifica fit() de PlantinFMCreator.
@@ -2,6 +2,15 @@
2
2
 
3
3
  Library for processing SARAPICO project metadata of _AMG_.
4
4
 
5
+ #### Version 0.4.6
6
+
7
+ - Se agrega función OpsProcessor.transformInputData() para convertir la lista de diccionarios entregadas por el decoder a un array de strings necesarios para procesar y clasificar los datos.
8
+
9
+ #### Version 0.4.5
10
+
11
+ - Se modifica clase PlantinClassifier para que ahora tome un clasificador y lo use para clasificar operaciones.
12
+ - Se modifica OpsProcessor para poder obtener clasificaciones (y no matrices de características de plantin como se venía probando).
13
+
5
14
  #### Version 0.4.4
6
15
 
7
16
  - Se modifica fit() de PlantinFMCreator.
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "sarapy"
3
3
 
4
- version = "0.4.4"
4
+ version = "0.4.6"
5
5
  authors = [
6
6
  {name = "Lucas Baldezzari", email = "lmbaldezzari@gmail.com"},]
7
7
  maintainers = [
@@ -4,7 +4,6 @@ import numpy as np
4
4
  # from sarapy.mlProcessors import PlantinFMCreator
5
5
  from sarapy.mlProcessors import PlantinClassifier
6
6
 
7
-
8
7
  class OpsProcessor():
9
8
  """Clase para procesar las operaciones de los operarios. La información se toma de la base de datos
10
9
  hostórica y se procesa para obtener un array con las operaciones clasificadas para cada operario.
@@ -22,8 +21,10 @@ class OpsProcessor():
22
21
  - distanciaMedia: Distancia media entre operaciones.
23
22
  """
24
23
 
25
- plclass_map = {"imputeDistances", "distanciaMedia", "umbral_precision"," dist_mismo_lugar", "max_dist",
24
+ plclass_map = {"classifier_file","imputeDistances", "distanciaMedia",
25
+ "umbral_precision"," dist_mismo_lugar", "max_dist",
26
26
  "umbral_ratio_dCdP", "deltaO_medio"}
27
+
27
28
  kwargs_plclass = {}
28
29
  ##recorro kwargs y usando plclass_map creo un nuevo diccionario con los valores que se pasaron
29
30
  for key, value in kwargs.items():
@@ -37,7 +38,7 @@ class OpsProcessor():
37
38
  self._classifiedOperations = np.array([]) ##array con las operaciones clasificadas
38
39
  self._last_row_db = 0 ##indicador de la última fila de los datos extraidos de la base de datos histórica
39
40
 
40
- def processOperations(self, newSample):
41
+ def processOperations(self, data):
41
42
  """Método para procesar las operaciones de los operarios.
42
43
 
43
44
  Se toma una nueva muestra y se procesa la información para clasificar las operaciones considerando el
@@ -45,20 +46,25 @@ class OpsProcessor():
45
46
  Se retorna un array con las clasificaciones concatenadas, manteniendo el orden de las operaciones por operario.
46
47
 
47
48
  Args:
48
- - newSample: lista con los datos (numpy.array de strings) de una muestra de operaciones.
49
- La forma de cada dato dentro de la lista newSample es (n,6). Las columnas de newSample son,
49
+ data: Es una lista de diccionario. Cada diccionario tiene los siguientes keys.
50
50
 
51
- - 0: op_number
52
- - 1: id_oprr
53
- - 2: tlm_spbb
54
- - 3: date_oprc
55
- - 4: lat
56
- - 5: lon
57
- - 6: precision
51
+ id_db, ID_NPDB, TLM_SPBB, date_oprc, latitud, longitud, precision
52
+
53
+ Ejemplo:
54
+
55
+ {"id_db":"1", "ID_NPDB":"XXAA123",
56
+ "TLM_SPBB": "1010001000010010101100010110000111101101001100000000000000000000",
57
+ "date_oprc":"2024-02-17 12:33:20",
58
+ "Latitud":"-32.145564789", "Longitud":"-55.145564789", "Precision": "0.25"}
59
+
60
+ Returns:
61
+ Lista de diccionarios con las clasificaciones. Cada diccionario tiene la forma
62
+ {"id_db": 10, "tag_seedling": 1, "tag_fertilizer": 1}
58
63
  """
59
64
 
60
65
  ##chqueo que newSample no esté vacío
61
- if len(newSample) != 0:
66
+ if len(data) != 0:
67
+ newSample = self.transformInputData(data)
62
68
  #Si tenemos nuevas operaciones, actualizamos el diccionario de operaciones
63
69
  self.updateOperationsDict(newSample) #actualizamos diccionario interno de la clase
64
70
  plantinClassifications = self.classifyForPlantin() #clasificamos las operaciones para plantín
@@ -77,12 +83,12 @@ class OpsProcessor():
77
83
  - newSample: lista con los datos (numpy.array de strings) de las operaciones.
78
84
  La forma de cada dato dentro de la lista newSample es (n,6). Las columnas de newSample son,
79
85
 
80
- - 0: op_number
81
- - 1: id_oprr
82
- - 2: tlm_spbb
86
+ - 0: id_db
87
+ - 1: ID_NPDP
88
+ - 2: TLM_SPBB
83
89
  - 3: date_oprc
84
- - 4: lat
85
- - 5: lon
90
+ - 4: latitud
91
+ - 5: longitud
86
92
  - 6: precision
87
93
 
88
94
  Returns:
@@ -91,36 +97,36 @@ class OpsProcessor():
91
97
  DE MANERA CORRECTA O HUBO ALGÚN PROBLEMA Y ASÍ VER QUÉ HACER EN EL MAIN
92
98
  """
93
99
 
94
- id_oprrs_w_newOperations = np.unique(newSample[:,1]) ##identificadores de operarios con nuevas operaciones en la muestra
100
+ ID_NPDPs_w_newOperations = np.unique(newSample[:,1]) ##identificadores de operarios con nuevas operaciones en la muestra
95
101
 
96
- ##chqueo si estos id_oprrs ya están en el diccionario, sino los agrego
97
- for id_oprr in id_oprrs_w_newOperations:
98
- if id_oprr not in self._operationsDict:
102
+ ##chqueo si estos ID_NPDPs ya están en el diccionario, sino los agrego
103
+ for ID_NPDP in ID_NPDPs_w_newOperations:
104
+ if ID_NPDP not in self._operationsDict:
99
105
  #El diccionario contiene la siguiente información:
100
- #sample_ops: np.array con las columnas de tlm_spbb, date_oprc, lat, lon, precision
101
- #last_oprc: np.array de la última operación con las columnas de tlm_spbb, date_oprc, lat, lon, precision
106
+ #sample_ops: np.array con las columnas de TLM_SPBB, date_oprc, lat, lon, precision
107
+ #last_oprc: np.array de la última operación con las columnas de TLM_SPBB, date_oprc, lat, lon, precision
102
108
  #first_day_op_classified: booleano para saber si es la primera operación del día fue clasificada
103
- self._operationsDict[id_oprr] = {"sample_ops": None,
109
+ self._operationsDict[ID_NPDP] = {"sample_ops": None,
104
110
  "last_oprc": None,
105
111
  "first_day_op_classified": False,
106
112
  "new_sample": False,
107
113
  "ops_numbers": None} #inicio del diccionario anidado para el nuevo operario
108
114
 
109
115
  ##actualizo el diccionario con las operaciones nuevas para aquellos operarios que correspondan
110
- for id_oprr in id_oprrs_w_newOperations:
111
- sample_ops = newSample[newSample[:,1] == id_oprr][:,2:] #me quedo con las columnas de tlm_spbb, date_oprc, lat, lon, precision
112
- ops_numbers = newSample[newSample[:,1] == id_oprr][:,0]
116
+ for ID_NPDP in ID_NPDPs_w_newOperations:
117
+ sample_ops = newSample[newSample[:,1] == ID_NPDP][:,2:] #me quedo con las columnas de TLM_SPBB, date_oprc, lat, lon, precision
118
+ ops_numbers = newSample[newSample[:,1] == ID_NPDP][:,0]
113
119
  ##actualizo el diccionario
114
- self._operationsDict[id_oprr]["sample_ops"] = sample_ops
115
- self._operationsDict[id_oprr]["ops_numbers"] = ops_numbers
120
+ self._operationsDict[ID_NPDP]["sample_ops"] = sample_ops
121
+ self._operationsDict[ID_NPDP]["ops_numbers"] = ops_numbers
116
122
  ##chequeo si tenemos última operación, si es así, asignamos dicha operación en la primera fila de sample_ops
117
- last_op = self._operationsDict[id_oprr]["last_oprc"]
123
+ last_op = self._operationsDict[ID_NPDP]["last_oprc"]
118
124
  ###si last_op es not None y last_op no está vacía, entonces concatenamos last_op con sample_ops
119
125
  if last_op is not None and last_op.size != 0:
120
- self._operationsDict[id_oprr]["sample_ops"] = np.vstack((last_op, sample_ops))
126
+ self._operationsDict[ID_NPDP]["sample_ops"] = np.vstack((last_op, sample_ops))
121
127
 
122
- self.updateNewSamplesValues(id_oprrs_w_newOperations) #actualizo el estado de 'new_sample' en el diccionario de operaciones
123
- self.updateLastOperations(id_oprrs_w_newOperations) #actualizo la última operación de una muestra de operaciones en el diccionario de operaciones
128
+ self.updateNewSamplesValues(ID_NPDPs_w_newOperations) #actualizo el estado de 'new_sample' en el diccionario de operaciones
129
+ self.updateLastOperations(ID_NPDPs_w_newOperations) #actualizo la última operación de una muestra de operaciones en el diccionario de operaciones
124
130
 
125
131
  def classifyForPlantin(self):
126
132
  """Método para clasificar las operaciones para plantín.
@@ -133,90 +139,135 @@ class OpsProcessor():
133
139
  ##creamos/reiniciamos el array con las clasificaciones de las operaciones para plantín
134
140
  plantinClassifications = None
135
141
 
136
- ##me quedo con los id_oprrs que tengan _operationsDict[id_oprr]["new_sample"] iguales a True
137
- ops_with_new_sample = [id_oprr for id_oprr in self.operationsDict.keys() if self.operationsDict[id_oprr]["new_sample"]]
142
+ ##me quedo con los ID_NPDPs que tengan _operationsDict[ID_NPDP]["new_sample"] iguales a True
143
+ ops_with_new_sample = [ID_NPDP for ID_NPDP in self.operationsDict.keys() if self.operationsDict[ID_NPDP]["new_sample"]]
138
144
 
139
- for id_oprr in ops_with_new_sample:#self.operationsDict.keys():
145
+ for ID_NPDP in ops_with_new_sample:#self.operationsDict.keys():
140
146
  ##clasificamos las operaciones para plantín
141
- operations = self.operationsDict[id_oprr]["sample_ops"]
147
+ operations = self.operationsDict[ID_NPDP]["sample_ops"]
142
148
  classified_ops = self._plantin_classifier.classify(operations)
143
149
 
144
150
  ##chequeo si first_day_op_classified es True, si es así, no se considera la primera fila de las classified_ops
145
- if self.operationsDict[id_oprr]["first_day_op_classified"]:
151
+ if self.operationsDict[ID_NPDP]["first_day_op_classified"]:
146
152
  classified_ops = classified_ops[1:]
147
153
 
148
- plantinClassifications = np.vstack((plantinClassifications, classified_ops)) if plantinClassifications is not None else classified_ops
149
-
150
- self.operationsDict[id_oprr]["first_day_op_classified"] = True
154
+ # plantinClassifications = np.vstack((plantinClassifications, classified_ops)) if plantinClassifications is not None else classified_ops
155
+ plantinClassifications = np.concatenate((plantinClassifications, classified_ops)) if plantinClassifications is not None else classified_ops
156
+
157
+ self.operationsDict[ID_NPDP]["first_day_op_classified"] = True
151
158
 
152
159
  return plantinClassifications
153
160
 
154
- def updateLastOperations(self, id_oprrs_w_newOperations):
161
+ def updateLastOperations(self, ID_NPDPs_w_newOperations):
155
162
  """Método para actualizar la última operación de una muestra de operaciones en el diccionario de operaciones
156
163
 
157
164
  Args:
158
165
  - newSample: lista con los datos (numpy.array de strings) de las operaciones.
159
166
  La forma de cada dato dentro de la lista newSample es (n,6). Las columnas de newSample son,
160
167
 
161
- - 0: op_number
162
- - 1: id_oprr
163
- - 2: tlm_spbb
168
+ - 0: id_db
169
+ - 1: ID_NPDP
170
+ - 2: TLM_SPBB
164
171
  - 3: date_oprc
165
- - 4: lat
166
- - 5: lon
172
+ - 4: latitud
173
+ - 5: longitud
167
174
  - 6: precision
168
175
  """
169
176
 
170
- for id_oprr in id_oprrs_w_newOperations:
171
- self._operationsDict[id_oprr]["last_oprc"] = self._operationsDict[id_oprr]["sample_ops"][-1]
177
+ for ID_NPDP in ID_NPDPs_w_newOperations:
178
+ self._operationsDict[ID_NPDP]["last_oprc"] = self._operationsDict[ID_NPDP]["sample_ops"][-1]
172
179
 
173
180
  def updateOperationsNumbers(self, new_ops_numbers):
174
181
  """Método para actualizar los números de operaciones en el diccionario de operaciones.
175
182
 
176
183
  Args:
177
- - 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.
184
+ - new_ops_numbers: array de la forma (n,2) con los números de operaciones en la primer columna y los ID_NPDPs en la segunda.
178
185
  """
179
- id_oprrs_w_newOperations = np.unique(new_ops_numbers[:,1]) ##identificadores de operarios con nuevas operaciones en la muestra
186
+ ID_NPDPs_w_newOperations = np.unique(new_ops_numbers[:,1]) ##identificadores de operarios con nuevas operaciones en la muestra
180
187
  opsNumbersList = np.array([]) ##array con los números de operaciones
181
188
 
182
- for id_oprr in id_oprrs_w_newOperations:
183
- opsNumbersList = np.append(opsNumbersList, self.operationsDict[id_oprr]["ops_numbers"].flatten())
189
+ for ID_NPDP in ID_NPDPs_w_newOperations:
190
+ opsNumbersList = np.append(opsNumbersList, self.operationsDict[ID_NPDP]["ops_numbers"].flatten())
184
191
 
185
192
  return opsNumbersList
186
193
 
187
- def updateNewSamplesValues(self, id_oprrs_w_newOperations):
194
+ def updateNewSamplesValues(self, ID_NPDPs_w_newOperations):
188
195
  """Método para actualizar el estado de 'new_sample' del diccionario de operaciones.
189
196
 
190
197
  Args:
191
- - id_oprrs_w_newOperations: lista con los id_oprrs que tienen nuevas operaciones.
198
+ - ID_NPDPs_w_newOperations: lista con los ID_NPDPs que tienen nuevas operaciones.
192
199
  """
193
200
 
194
201
  ##recorro el diccionario de operaciones y actualizo el estado de 'new_sample' a
195
- ##True para los id_oprrs que tienen nuevas operaciones y a False para los que no tienen nuevas operaciones
196
- for id_oprr in self.operationsDict.keys():
197
- if id_oprr in id_oprrs_w_newOperations:
198
- self._operationsDict[id_oprr]["new_sample"] = True
202
+ ##True para los ID_NPDPs que tienen nuevas operaciones y a False para los que no tienen nuevas operaciones
203
+ for ID_NPDP in self.operationsDict.keys():
204
+ if ID_NPDP in ID_NPDPs_w_newOperations:
205
+ self._operationsDict[ID_NPDP]["new_sample"] = True
199
206
  else:
200
- self._operationsDict[id_oprr]["new_sample"] = False
207
+ self._operationsDict[ID_NPDP]["new_sample"] = False
201
208
 
202
209
  def resetAllNewSamplesValues(self):
203
210
  """Método para resetar todos los valores de new_sample en el diccionario de operaciones.
204
211
  """
205
212
 
206
- for id_oprr in self.operationsDict.keys():
207
- self._operationsDict[id_oprr]["new_sample"] = False
213
+ for ID_NPDP in self.operationsDict.keys():
214
+ self._operationsDict[ID_NPDP]["new_sample"] = False
208
215
 
209
216
  def getActualOperationsNumbers(self):
210
217
  """Método para obtener los números de operaciones desde el diccionario de operaciones para aquellos operarios que
211
218
  tienen nuevas operaciones en la muestra."""
212
219
 
213
220
  opsNumbersList = np.array([])
214
- for id_oprr in self.operationsDict.keys():
215
- if self.operationsDict[id_oprr]["new_sample"]:
216
- opsNumbersList = np.append(opsNumbersList, self.operationsDict[id_oprr]["ops_numbers"].flatten())
221
+ for ID_NPDP in self.operationsDict.keys():
222
+ if self.operationsDict[ID_NPDP]["new_sample"]:
223
+ opsNumbersList = np.append(opsNumbersList, self.operationsDict[ID_NPDP]["ops_numbers"].flatten())
217
224
 
218
225
  return opsNumbersList
226
+
227
+ def updateFirstDayOp(self):
228
+ """Método para actualizar el indicador de si es la primera operación del día para cada operario en el diccionario de operaciones.
229
+ """
219
230
 
231
+ for ID_NPDP in self.operationsDict.keys():
232
+ self._operationsDict[ID_NPDP]["first_day_op_classified"] = False
233
+
234
+ def transformInputData(self, data):
235
+ """Función para transformar los datos de entrada que llegan del decoder
236
+
237
+ Args:
238
+ data: Es una lista de diccionario. Cada diccionario tiene los siguientes keys.
239
+
240
+ id_db, ID_NPDB, TLM_SPBB, date_oprc, latitud, longitud, precision
241
+
242
+ Ejemplo:
243
+
244
+ {"id_db":"1", "ID_NPDB":"XXAA123",
245
+ "TLM_SPBB": "1010001000010010101100010110000111101101001100000000000000000000",
246
+ "date_oprc":"2024-02-17 12:33:20",
247
+ "Latitud":"-32.145564789", "Longitud":"-55.145564789", "Precision": "0.25"}
248
+
249
+ Returns:
250
+ Retorna un array de strings con la siguiente estructura
251
+ - 0: id_db
252
+ - 1: ID_NPDP
253
+ - 2: TLM_SPBB
254
+ - 3: date_oprc
255
+ - 4: latitud
256
+ - 5: longitud
257
+ - 6: precision
258
+ """
259
+
260
+ ##convierto list_of_dics a un array de strings
261
+ newSample = np.array([[d["id_db"],
262
+ d["ID_NPDB"],
263
+ d["TLM_SPBB"],
264
+ d["date_oprc"],
265
+ d["Latitud"],
266
+ d["Longitud"],
267
+ d["precision"]] for d in data])
268
+
269
+ return newSample
270
+
220
271
  def cleanSamplesOperations(self):
221
272
  """Método para limpiar las operaciones de un operario en el diccionario de operaciones.
222
273
 
@@ -224,25 +275,18 @@ class OpsProcessor():
224
275
  - newSample: lista con los datos (numpy.array de strings) de las operaciones.
225
276
  La forma de cada dato dentro de la lista newSample es (n,6). Las columnas de newSample son,
226
277
 
227
- - 0: op_number
228
- - 1: id_oprr
229
- - 2: tlm_spbb
278
+ - 0: id_db
279
+ - 1: ID_NPDP
280
+ - 2: TLM_SPBB
230
281
  - 3: date_oprc
231
- - 4: lat
232
- - 5: lon
282
+ - 4: latitud
283
+ - 5: longitud
233
284
  - 6: precision
234
285
  """
235
286
 
236
- for id_oprr in self.operationsDict.keys():
237
- self._operationsDict[id_oprr]["sample_ops"] = None
238
-
239
- def updateFirstDayOp(self):
240
- """Método para actualizar el indicador de si es la primera operación del día para cada operario en el diccionario de operaciones.
241
- """
242
-
243
- for id_oprr in self.operationsDict.keys():
244
- self._operationsDict[id_oprr]["first_day_op_classified"] = False
245
-
287
+ for ID_NPDP in self.operationsDict.keys():
288
+ self._operationsDict[ID_NPDP]["sample_ops"] = None
289
+
246
290
  @property
247
291
  def operationsDict(self):
248
292
  return self._operationsDict
@@ -253,35 +297,16 @@ if __name__ == "__main__":
253
297
  import pandas as pd
254
298
  import numpy as np
255
299
  import os
256
- path = os.path.join(os.getcwd(), "examples\\volcado_17112023_NODE_processed.csv")
300
+ path = os.path.join(os.getcwd(), "examples\\volcado_17112023_NODE_processed_modified.csv")
257
301
  data_df = pd.read_csv(path, sep=";", )
258
302
  raw_data = data_df.to_numpy().astype(str)
259
-
260
- ##seed de numpy en 42
261
- np.random.seed(42)
262
-
263
- size = data_df[data_df["id_oprr"] == 1].shape[0]
264
- data_df.loc[data_df["id_oprr"] == 1, "id_dataBase"] = range(1,size+1)
265
- size = data_df[data_df["id_oprr"] == 2].shape[0]
266
- data_df.loc[data_df["id_oprr"] == 2, "id_dataBase"] = range(1,size+1)
267
- ##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.
268
- samples = []
269
- index = 0
270
- while True:
271
- random_value = np.random.randint(8, 15)
272
- if index + random_value < len(raw_data):
273
- samples.append(raw_data[index:index+random_value])
274
- else:
275
- break
276
- index += random_value
303
+
304
+ ##tomo los valos de data_df y formo una lista de diccionarios por cada fila
305
+ samples = data_df.to_dict(orient="records")
277
306
 
278
307
  # from sarapy.dataProcessing import OpsProcessor
279
- op = OpsProcessor(imputeDistances = False)
280
-
308
+ op = OpsProcessor(classifier_file="examples\\pip_lda_imp.pkl", imputeDistances = False)
281
309
  op.operationsDict
282
310
 
283
311
  ##procesamos una muestra
284
- print(op.processOperations(samples[10]))
285
- print(op.processOperations(np.array([])))
286
- print(op.processOperations(samples[11]))
287
- # data_df.loc[data_df["id_oprr"] == 1].head(15)
312
+ print(op.processOperations(samples))
@@ -3,12 +3,17 @@ import numpy as np
3
3
  from sklearn.base import BaseEstimator, TransformerMixin
4
4
  from sklearn.pipeline import Pipeline
5
5
  from sarapy.mlProcessors import PlantinFMCreator
6
+ import pickle
6
7
 
7
8
  class PlantinClassifier(BaseEstimator, TransformerMixin):
8
9
  """Clase para implementar el pipeline de procesamiento de datos para la clasificación del tipo de operación para plantines."""
9
10
 
10
- def __init__(self, **kwargs):
11
- """Constructor de la clase PlantinClassifier."""
11
+ def __init__(self, classifier_file = "", **kwargs):
12
+ """Constructor de la clase PlantinClassifier.
13
+
14
+ Args:
15
+ - classifier_file: String con el nombre del archivo que contiene el clasificador entrenado. El archivo a cargar es un archivo .pkl.
16
+ """
12
17
 
13
18
  plclass_map = {"imputeDistances", "distanciaMedia", "umbral_precision"," dist_mismo_lugar", "max_dist",
14
19
  "umbral_ratio_dCdP", "deltaO_medio"}
@@ -21,10 +26,12 @@ class PlantinClassifier(BaseEstimator, TransformerMixin):
21
26
  kwargs_plfmc[key] = value
22
27
 
23
28
  self._plantinFMCreator = PlantinFMCreator.PlantinFMCreator(**kwargs_plfmc)
24
-
25
- self._pipeline = Pipeline([
26
- ("FMCreator", self._plantinFMCreator),
27
- ])
29
+ #cargo el clasificador con pickle. Usamos try para capturar el error FileNotFoundError
30
+ try:
31
+ with open(classifier_file, 'rb') as file:
32
+ self._pipeline = pickle.load(file)
33
+ except FileNotFoundError:
34
+ print("El archivo no se encuentra en el directorio actual.")
28
35
 
29
36
  def classify(self, newData):
30
37
  """Genera la clasificación de las operaciones para plantines.
@@ -36,8 +43,8 @@ class PlantinClassifier(BaseEstimator, TransformerMixin):
36
43
  - 3: longitud de la operación
37
44
  - 4: precision del GPS
38
45
  """
39
-
40
- return self._pipeline.fit_transform(newData).round(2)
46
+ feature_matrix = self._plantinFMCreator.fit_transform(newData)
47
+ return self._pipeline.predict(feature_matrix)
41
48
 
42
49
  if __name__ == "__main__":
43
50
  from sarapy.dataProcessing import OpsProcessor
@@ -60,9 +67,5 @@ if __name__ == "__main__":
60
67
  break
61
68
  index += random_value
62
69
 
63
- op = OpsProcessor.OpsProcessor()
64
- ##actualizo el diccionario de operaciones
65
- op.updateOperationsDict(sample[12])
66
- op.operationsDict
67
- plantin_classifier = PlantinClassifier(imputeDistances = False)
68
- plantin_classifier.classify(op.operationsDict["1"]["sample_ops"])
70
+ plantin_classifier = PlantinClassifier(classifier_file="examples\\pip_lda_imp.pkl",imputeDistances = False)
71
+ plantin_classifier.classify(sample[50][:,2:])
@@ -1,2 +1,2 @@
1
1
  ## Version of the package
2
- __version__ = "0.4.4"
2
+ __version__ = "0.4.6"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sarapy
3
- Version: 0.4.4
3
+ Version: 0.4.6
4
4
  Home-page: https://github.com/lucasbaldezzari/sarapy
5
5
  Author: Lucas Baldezzari
6
6
  Author-email: Lucas Baldezzari <lmbaldezzari@gmail.com>
@@ -18,6 +18,15 @@ Requires-Dist: geopy
18
18
 
19
19
  Library for processing SARAPICO project metadata of _AMG_.
20
20
 
21
+ #### Version 0.4.6
22
+
23
+ - Se agrega función OpsProcessor.transformInputData() para convertir la lista de diccionarios entregadas por el decoder a un array de strings necesarios para procesar y clasificar los datos.
24
+
25
+ #### Version 0.4.5
26
+
27
+ - Se modifica clase PlantinClassifier para que ahora tome un clasificador y lo use para clasificar operaciones.
28
+ - Se modifica OpsProcessor para poder obtener clasificaciones (y no matrices de características de plantin como se venía probando).
29
+
21
30
  #### Version 0.4.4
22
31
 
23
32
  - Se modifica fit() de PlantinFMCreator.
File without changes
File without changes
File without changes