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.
- {sarapy-0.4.4 → sarapy-0.4.6}/PKG-INFO +10 -1
- {sarapy-0.4.4 → sarapy-0.4.6}/README.md +9 -0
- {sarapy-0.4.4 → sarapy-0.4.6}/pyproject.toml +1 -1
- {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/dataProcessing/OpsProcessor.py +131 -106
- {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/mlProcessors/PlantinClassifier.py +17 -14
- {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/version.py +1 -1
- {sarapy-0.4.4 → sarapy-0.4.6}/sarapy.egg-info/PKG-INFO +10 -1
- {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/__init__.py +0 -0
- {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/dataProcessing/GeoProcessor.py +0 -0
- {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/dataProcessing/TLMSensorDataProcessor.py +0 -0
- {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/dataProcessing/TimeSeriesProcessor.py +0 -0
- {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/dataProcessing/__init__.py +0 -0
- {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/mlProcessors/PlantinFMCreator.py +0 -0
- {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/mlProcessors/__init__.py +0 -0
- {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/preprocessing/DistancesImputer.py +0 -0
- {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/preprocessing/FertilizerImputer.py +0 -0
- {sarapy-0.4.4 → sarapy-0.4.6}/sarapy/preprocessing/__init__.py +0 -0
- {sarapy-0.4.4 → sarapy-0.4.6}/sarapy.egg-info/SOURCES.txt +0 -0
- {sarapy-0.4.4 → sarapy-0.4.6}/sarapy.egg-info/dependency_links.txt +0 -0
- {sarapy-0.4.4 → sarapy-0.4.6}/sarapy.egg-info/requires.txt +0 -0
- {sarapy-0.4.4 → sarapy-0.4.6}/sarapy.egg-info/top_level.txt +0 -0
- {sarapy-0.4.4 → sarapy-0.4.6}/setup.cfg +0 -0
- {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.
|
|
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.
|
|
@@ -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 = {"
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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(
|
|
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:
|
|
81
|
-
- 1:
|
|
82
|
-
- 2:
|
|
86
|
+
- 0: id_db
|
|
87
|
+
- 1: ID_NPDP
|
|
88
|
+
- 2: TLM_SPBB
|
|
83
89
|
- 3: date_oprc
|
|
84
|
-
- 4:
|
|
85
|
-
- 5:
|
|
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
|
-
|
|
100
|
+
ID_NPDPs_w_newOperations = np.unique(newSample[:,1]) ##identificadores de operarios con nuevas operaciones en la muestra
|
|
95
101
|
|
|
96
|
-
##chqueo si estos
|
|
97
|
-
for
|
|
98
|
-
if
|
|
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
|
|
101
|
-
#last_oprc: np.array de la última operación con las columnas de
|
|
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[
|
|
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
|
|
111
|
-
sample_ops = newSample[newSample[:,1] ==
|
|
112
|
-
ops_numbers = newSample[newSample[:,1] ==
|
|
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[
|
|
115
|
-
self._operationsDict[
|
|
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[
|
|
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[
|
|
126
|
+
self._operationsDict[ID_NPDP]["sample_ops"] = np.vstack((last_op, sample_ops))
|
|
121
127
|
|
|
122
|
-
self.updateNewSamplesValues(
|
|
123
|
-
self.updateLastOperations(
|
|
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
|
|
137
|
-
ops_with_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
|
|
145
|
+
for ID_NPDP in ops_with_new_sample:#self.operationsDict.keys():
|
|
140
146
|
##clasificamos las operaciones para plantín
|
|
141
|
-
operations = self.operationsDict[
|
|
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[
|
|
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
|
-
|
|
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,
|
|
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:
|
|
162
|
-
- 1:
|
|
163
|
-
- 2:
|
|
168
|
+
- 0: id_db
|
|
169
|
+
- 1: ID_NPDP
|
|
170
|
+
- 2: TLM_SPBB
|
|
164
171
|
- 3: date_oprc
|
|
165
|
-
- 4:
|
|
166
|
-
- 5:
|
|
172
|
+
- 4: latitud
|
|
173
|
+
- 5: longitud
|
|
167
174
|
- 6: precision
|
|
168
175
|
"""
|
|
169
176
|
|
|
170
|
-
for
|
|
171
|
-
self._operationsDict[
|
|
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
|
|
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
|
-
|
|
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
|
|
183
|
-
opsNumbersList = np.append(opsNumbersList, self.operationsDict[
|
|
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,
|
|
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
|
-
-
|
|
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
|
|
196
|
-
for
|
|
197
|
-
if
|
|
198
|
-
self._operationsDict[
|
|
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[
|
|
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
|
|
207
|
-
self._operationsDict[
|
|
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
|
|
215
|
-
if self.operationsDict[
|
|
216
|
-
opsNumbersList = np.append(opsNumbersList, self.operationsDict[
|
|
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:
|
|
228
|
-
- 1:
|
|
229
|
-
- 2:
|
|
278
|
+
- 0: id_db
|
|
279
|
+
- 1: ID_NPDP
|
|
280
|
+
- 2: TLM_SPBB
|
|
230
281
|
- 3: date_oprc
|
|
231
|
-
- 4:
|
|
232
|
-
- 5:
|
|
282
|
+
- 4: latitud
|
|
283
|
+
- 5: longitud
|
|
233
284
|
- 6: precision
|
|
234
285
|
"""
|
|
235
286
|
|
|
236
|
-
for
|
|
237
|
-
self._operationsDict[
|
|
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\\
|
|
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
|
-
##
|
|
261
|
-
|
|
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
|
|
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
|
-
|
|
26
|
-
(
|
|
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.
|
|
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
|
-
|
|
64
|
-
|
|
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.
|
|
2
|
+
__version__ = "0.4.6"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: sarapy
|
|
3
|
-
Version: 0.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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|