sarapy 1.3.1__py3-none-any.whl → 2.0.0__py3-none-any.whl

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/stats/stats.py ADDED
@@ -0,0 +1,258 @@
1
+ import numpy as np
2
+ from scipy.stats import skew, kurtosis, gaussian_kde
3
+ import pandas as pd
4
+ import logging
5
+
6
+ logging.basicConfig(level=logging.DEBUG)
7
+
8
+ def getMA(data, window_size=104, mode='same'):
9
+ """
10
+ Función para calcular la media móvil de una serie temporal.
11
+ data: numpy array con los datos de la serie temporal
12
+ window_size: tamaño de la ventana para calcular la media móvil
13
+ """
14
+ return np.convolve(data, np.ones(window_size)/window_size, mode=mode)
15
+
16
+ def probabilidadEmpirica(data:np.ndarray, umbral):
17
+ """
18
+ Función para calcular la probabilidad empírica de un valor en una serie temporal.
19
+ data: numpy array con los datos de la serie temporal
20
+ umbral: valor umbral para calcular la probabilidad empírica
21
+ """
22
+ return data[data>umbral]/data.shape[0]
23
+
24
+ def penalizacion(alpha, skewness, beta, kurtosis):
25
+ """
26
+ Función para calcular la penalización de una serie temporal.
27
+ alpha: valor de penalización
28
+ skewness: asimetría de la serie temporal
29
+ kurtosis: curtosis de la serie temporal
30
+ """
31
+ return np.exp(-alpha * np.abs(skewness)) * np.exp(-beta * np.abs(kurtosis))
32
+
33
+ def probSaturacion(probEmpirica, penalizacion):
34
+ """
35
+ Función para calcular la probabilidad de saturación de una serie temporal.
36
+ probEmpirica: probabilidad empírica de la serie temporal
37
+ penalizacion: penalización de la serie temporal
38
+ """
39
+ return probEmpirica * penalizacion
40
+
41
+ def estimarKDE(distorsion_data, method="scott"):
42
+ """
43
+ Recibe una serie o array de valores dstpt de un nodo.
44
+ Retorna una función de densidad KDE evaluable.
45
+ """
46
+ kde = gaussian_kde(distorsion_data, bw_method=method)
47
+ return kde
48
+
49
+ def saturationProbability(distorsion_data, saturation_mode = "alto", umbrales = (1,14), alpha=0.5, beta=0.2):
50
+ """
51
+ Calcula la probabilidad de que una ventana esté saturada.
52
+ - distorsion_data: array de valores dstpt.
53
+ - saturation_mode: modo de saturación, puede ser "bajo", "alto" o "ambos".
54
+ - umbrales: tupla con los valores de umbral bajo y alto.
55
+ - kde: booleano, si se debe calcular la densidad de probabilidad.
56
+ - alpha, beta: coeficientes de penalización para skewness y curtosis.
57
+
58
+ Devuelve un diccionario con los componentes y la probabilidad final.
59
+ """
60
+ ##chequeo si saturation_mode es válido
61
+ if saturation_mode not in ["bajo", "alto", "ambos"]:
62
+ raise ValueError("saturation_mode debe ser 'bajo', 'alto' o 'ambos'.")
63
+ if distorsion_data.shape[0] == 0:
64
+ raise ValueError("La distorsion_data no puede estar vacía.")
65
+ if distorsion_data.shape[0] < 50:
66
+ logging.warning("La distorsion_data tiene menos de 50 elementos. Los resultados pueden no ser representativos.")
67
+
68
+ ventana_filtered = distorsion_data.copy()
69
+ if saturation_mode == "bajo":
70
+ ventana_filtered = ventana_filtered[ventana_filtered < umbrales[0]]
71
+ elif saturation_mode == "alto":
72
+ ventana_filtered = ventana_filtered[ventana_filtered > umbrales[1]]
73
+ elif saturation_mode == "ambos":
74
+ ventana_filtered = ventana_filtered[(ventana_filtered < umbrales[0]) | (ventana_filtered > umbrales[1])]
75
+
76
+ ##chequeo si la ventana filtrada está vacía
77
+ if ventana_filtered.shape[0] == 0:
78
+ logging.warning("Ventana filtrada vacía. Se retornará 0.0.")
79
+ return 0.0
80
+
81
+ skew_val = skew(ventana_filtered)
82
+ kurt_val = kurtosis(ventana_filtered)
83
+
84
+ pena = penalizacion(alpha, skew_val, beta, kurt_val)
85
+ ##chequeo que pena no sea nan, sino reemplazo por 1
86
+ if np.isnan(pena):
87
+ logging.warning("La penalización es NaN. Se reemplazará por 1.")
88
+ pena = 1.0
89
+ # Probabilidad
90
+ proba_empirica = ventana_filtered.shape[0]/distorsion_data.shape[0]
91
+ prob_saturacion = proba_empirica * pena
92
+
93
+ logging.debug(f"Ventana filtrada: {ventana_filtered.shape[0]}, {distorsion_data.shape[0]}, {proba_empirica}, {pena}")
94
+ return prob_saturacion
95
+
96
+ def movingProbability(distorsion_data, window_size=104, **kwargs):
97
+ """
98
+ Calcula la probabilidad de saturación de una serie temporal de distorsión.
99
+ La ventana se mueve sin solapamiento (stride = window_size) y sin padding,
100
+ pero incluye el remanente final si queda un bloque incompleto.
101
+
102
+ Params:
103
+ - distorsion_data: array de valores dstpt.
104
+ - window_size: tamaño de la ventana.
105
+ - kwargs: parámetros adicionales para saturationProbability.
106
+
107
+ Devuelve:
108
+ - probabilities: array de probabilidades por ventana (incluye parcial).
109
+ - probas_array: array de salida mismo tamaño que distorsion_data.
110
+ """
111
+
112
+ total_length = len(distorsion_data)
113
+ n_windows = total_length // window_size
114
+ remainder = total_length % window_size
115
+
116
+ total_blocks = n_windows + (1 if remainder > 0 else 0)
117
+
118
+ probabilities = np.zeros(total_blocks)
119
+ probas_array = np.zeros_like(distorsion_data)
120
+
121
+ for i in range(n_windows):
122
+ start = i * window_size
123
+ end = start + window_size
124
+ ventana = distorsion_data[start:end]
125
+ probabilities[i] = saturationProbability(ventana, **kwargs)
126
+ probas_array[start:end] = probabilities[i]
127
+
128
+ # Procesamos el bloque final (parcial) si existe
129
+ if remainder > 0:
130
+ start = n_windows * window_size
131
+ end = total_length
132
+ ventana = distorsion_data[start:end]
133
+ probabilities[-1] = saturationProbability(ventana, **kwargs)
134
+ probas_array[start:end] = probabilities[-1]
135
+
136
+ return probabilities, probas_array
137
+
138
+ def resumen_sensor(df, values_col = "dstpt", pctbajo_value = 1, pctalto_value = 14):
139
+ """
140
+ Función para obtener un resumen estadístico de los valores de un sensor.
141
+ valores: numpy array con los valores del sensor
142
+ Retorna un diccionario con la media, desviación estándar, asimetría, curtosis y porcentajes de valores bajos y altos.
143
+ """
144
+
145
+ pctbajo = lambda x: np.mean(np.array(x) < pctbajo_value)
146
+ pctbajo.__name__ = "pct_bajo"
147
+ pctalto = lambda x: np.mean(np.array(x) > pctalto_value)
148
+ pctalto.__name__ = "pct_alto"
149
+ funciones = ["count","mean", "std", "min", "max", skew, kurtosis, pctbajo, pctalto]
150
+ table = df[[values_col,"nodo"]].pivot_table(index="nodo", values=values_col, aggfunc=funciones, fill_value=0).reset_index()
151
+ return table
152
+
153
+ def detectar_secuencia_saturada(valores, umbral_bajo=1, umbral_alto=14, longitud_min=10):
154
+ """
155
+ Función para detectar si hay una secuencia de valores por debajo o por encima de los umbrales.
156
+ valores: numpy array con los valores del sensor
157
+ umbral_bajo: valor por debajo del cual se considera que el sensor está saturado
158
+ umbral_alto: valor por encima del cual se considera que el sensor está saturado
159
+ longitud_min: longitud mínima de la secuencia para considerarla saturada
160
+
161
+ Return
162
+ -------
163
+ bool: True si hay una secuencia de valores por debajo o por encima de los umbrales, False en caso contrario.
164
+ Esta función busca secuencias de valores por debajo del umbral bajo o por encima del umbral alto.
165
+ """
166
+ estado = (np.array(valores) < umbral_bajo) | (np.array(valores) > umbral_alto)
167
+ sec_actual = 0
168
+ for val in estado:
169
+ if val:
170
+ sec_actual += 1
171
+ if sec_actual >= longitud_min:
172
+ return True
173
+ else:
174
+ sec_actual = 0
175
+ return False
176
+
177
+ if __name__ == "__main__":
178
+ #cargo archivo examples\volcado_17112023_NODE_processed.csv
179
+ from sarapy.utils.plotting import plotTemporalData, heatmapAlphavsBeta
180
+ import pandas as pd
181
+ import numpy as np
182
+ import os
183
+ import sarapy.utils.getRawOperations as getRawOperations
184
+ from sarapy.dataProcessing import OpsProcessor
185
+ from sarapy.preprocessing import TransformInputData
186
+ from sarapy.dataProcessing import TLMSensorDataProcessor
187
+
188
+ tlmsde = TLMSensorDataProcessor.TLMSensorDataProcessor()
189
+
190
+ nodo = "UPM025N"
191
+
192
+ data_path = os.path.join(os.getcwd(), f"examples\\2025-04-10\\{nodo}\\data.json")
193
+ historical_data_path = os.path.join(os.getcwd(), f"examples\\2025-04-10\\{nodo}\\historical-data.json")
194
+
195
+ raw_data = pd.read_json(data_path, orient="records").to_dict(orient="records")
196
+ raw_data2 = pd.read_json(historical_data_path, orient="records").to_dict(orient="records")
197
+
198
+ transform_input_data = TransformInputData.TransformInputData()
199
+
200
+ raw_ops = getRawOperations.getRawOperations(raw_data, raw_data2)
201
+ datum = transform_input_data.fit_transform(raw_ops)[:,2]
202
+ telemetria = tlmsde.fit_transform(datum)
203
+ mode = telemetria[:,tlmsde.dataPositions["MODEFlag"]]
204
+ dstpt = telemetria[:,tlmsde.dataPositions["DSTRPT"]]
205
+
206
+ op = OpsProcessor.OpsProcessor(classifier_file='modelos\\pipeline_rf.pkl', imputeDistances = False,
207
+ regresor_file='modelos\\regresor.pkl', poly_features_file='modelos\\poly_features.pkl')
208
+ op.operationsDict
209
+ data_processed = op.processOperations(raw_ops)
210
+
211
+ #paso la lista de operaciones a un dataframe
212
+ df = pd.DataFrame(data_processed)
213
+ df["mode"] = mode
214
+ df["dstpt"] = dstpt
215
+ df["nodo"] = nodo
216
+ df["dstpt_ma"] = getMA(df["dstpt"].values, window_size=104, mode='same')
217
+ ##me quedo con los datos donde mode==0
218
+ df = df[df["mode"] == 0]
219
+
220
+ #calculo el resumen del sensor
221
+ resumen = resumen_sensor(df, values_col="dstpt_ma", pctbajo_value=1, pctalto_value=14.6)
222
+ print(resumen)
223
+ #calculo la probabilidad de saturación
224
+ ma = df["dstpt_ma"].values
225
+ prob_saturacion = saturationProbability(ma, saturation_mode="alto", umbrales=(1, 14),
226
+ alpha=0.2, beta=0.2)
227
+
228
+ print(f"Probabilidad de saturación: {prob_saturacion}")
229
+
230
+ ventana = 104
231
+ probs, array_probs = movingProbability(ma[100:2500], window_size=ventana, saturation_mode="alto", alpha=0.05, beta=0.05, umbrales=(1, 14.9))
232
+
233
+ # heatmapAlphavsBeta(ma, saturationProbability)
234
+
235
+ import matplotlib.pyplot as plt
236
+ ##grafico ma[100:2500] y array_probs en una misma figura pero array_probs en el eje y derecho
237
+ fig, ax1 = plt.subplots(figsize=(15, 10))
238
+ ax1.plot(ma[100:2500], label='MA', color='blue')
239
+ ax1.set_xlabel("Operación")
240
+ ax1.set_ylabel("MA", color='blue')
241
+ # ax1.set_ylim(12, 15)
242
+ ax1.tick_params(axis='y', labelcolor='blue')
243
+ ax2 = ax1.twinx()
244
+ ax2.plot(array_probs, label='Probabilidad de saturación', color='grey')
245
+ 3#agrego ahline con array_probs.mean()
246
+ ax2.axhline(y=array_probs.mean(), color='black', linestyle=':', label='Media de probabilidad',linewidth=3)
247
+ ax2.set_ylabel("Probabilidad de saturación", color='black')
248
+ ax2.tick_params(axis='y', labelcolor='black')
249
+ ax1.axhline(y=1, color='green', linestyle='--', label='Umbral bajo')
250
+ ax1.axhline(y=14, color='red', linestyle='--', label='Umbral alto')
251
+ ax1.set_title(f"Análisis de {nodo} - DSTPT")
252
+ ax1.legend(loc='lower left')
253
+ ax2.legend(loc='lower right')
254
+ plt.show()
255
+
256
+ colors = ["#e71616","#63d536"]
257
+ plotTemporalData(df, nodos = [nodo], columnas = ["dstpt_ma"], title = "DSTPT",sameFig = False, show = True,
258
+ save = False, filename = "dstpt_plot.png", figsize=(15, 10), colors=colors)
@@ -0,0 +1,96 @@
1
+
2
+ import matplotlib.pyplot as plt
3
+ import numpy as np
4
+ import pandas as pd
5
+ def plotTemporalData(df, columnas, nodos = None, title = "DSTPT", xlabel = "Operación", ylabel = "DSTPT",limit_lines=(1,14),
6
+ sameFig = False, show = True, save = False, filename = "dstpt_plot.png", figsize=(15, 10), colors="blue"):
7
+ """
8
+ Grafica los datos de dstpt de los nodos temporalmente.
9
+
10
+ Parámetros:
11
+ ---------
12
+ df : DataFrame
13
+ DataFrame con los datos a graficar. Los nodos deben estar en una columna llamada "nodo".
14
+ nodos : list, opcional
15
+ Lista de nodos a graficar. Si es None, se grafican todos los nodos.
16
+ columnas : list
17
+ Lista de columnas a graficar. Por defecto es ["dstpt"].
18
+ title : str, opcional
19
+ Título de la gráfica. Por defecto es "DSTPT".
20
+ xlabel : str, opcional
21
+ Etiqueta del eje x. Por defecto es "X-axis".
22
+ ylabel : str, opcional
23
+ Etiqueta del eje y. Por defecto es "Y-axis".
24
+ sameFig : bool, opcional
25
+ Si es True, se grafican todos los nodos en la misma figura. Por defecto es False.
26
+ """
27
+ if nodos is None:
28
+ nodos = df["nodo"].unique()
29
+
30
+ if len(nodos) == 1:
31
+ sameFig = True
32
+
33
+ if sameFig:
34
+ fig, ax = plt.subplots(figsize=figsize)
35
+ ##grafico todos los nodos en la misma figura
36
+ ##Grafico cada columna en la misma figura
37
+ for nodo in nodos:
38
+ for j, columna in enumerate(columnas):
39
+ data_nodo = df[df["nodo"]==nodo][columnas].values
40
+ ax.plot(data_nodo, label=nodo, color=colors[j])
41
+ ax.set_title(title)
42
+ ax.set_xlabel(xlabel)
43
+ ax.set_ylabel(ylabel)
44
+ #agrego lineas horizontales en los limites
45
+ ax.axhline(y=limit_lines[0], color='b', linestyle='--')
46
+ ax.axhline(y=limit_lines[1], color='b', linestyle='--')
47
+ ax.legend()
48
+ if save:
49
+ plt.savefig(filename)
50
+ if show:
51
+ plt.show()
52
+ else:
53
+ ##grafico cada nodo en un axis diferente
54
+ fig, axs = plt.subplots(len(nodos), 1, figsize=figsize)
55
+ ##grafico cada nodo en un mismo axis y cada columna con un color diferente
56
+ for i, nodo in enumerate(nodos):
57
+ for j, columna in enumerate(columnas):
58
+ data_nodo = df[df["nodo"]==nodo][columna].values
59
+ axs[i].plot(data_nodo, label=columna, color=colors[j])
60
+ axs[i].axhline(y=limit_lines[0], color='b', linestyle='--')
61
+ axs[i].axhline(y=limit_lines[1], color='b', linestyle='--')
62
+ axs[i].set_ylabel(ylabel)
63
+ axs[i].set_xticks([])
64
+ axs[i].text(len(data_nodo)*1.1, 0.9, f"{nodo}", ha='right', va='top', fontsize=10,
65
+ bbox=dict(facecolor='#c1ddf7', alpha=1, edgecolor='black', boxstyle='round,pad=0.3'))
66
+ # axs[i].legend()
67
+ ##activo xticks en el último eje
68
+ axs[i].set_xlabel(xlabel)
69
+ if save:
70
+ plt.savefig(filename)
71
+ if show:
72
+ plt.show()
73
+
74
+ def heatmapAlphavsBeta(data, saturationProbability):
75
+ # Definimos grilla de alpha y beta
76
+ alpha_vals = np.linspace(0, 1, 20)
77
+ beta_vals = np.linspace(0, 1, 20)
78
+
79
+ # Creamos matriz de resultados
80
+ Psat_matrix = np.zeros((len(alpha_vals), len(beta_vals)))
81
+
82
+ for i, alpha in enumerate(alpha_vals):
83
+ for j, beta in enumerate(beta_vals):
84
+ Psat_matrix[i, j] = saturationProbability(data, saturation_mode="alto", umbrales=(1, 14),
85
+ alpha=alpha, beta=beta)
86
+
87
+ # Graficamos el heatmap
88
+ import matplotlib.pyplot as plt
89
+ import seaborn as sns
90
+
91
+ plt.figure(figsize=(10, 8))
92
+ sns.heatmap(Psat_matrix, xticklabels=np.round(beta_vals, 2), yticklabels=np.round(alpha_vals, 2), cmap="YlOrRd")
93
+ plt.title("Evolución de Psat en función de α (vertical) y β (horizontal)")
94
+ plt.xlabel(r"$\beta$ (peso de kurtosis)")
95
+ plt.ylabel(r"$\alpha$ (peso de skewness)")
96
+ plt.show()
sarapy/version.py CHANGED
@@ -1,2 +1,2 @@
1
1
  ## Version of the package
2
- __version__ = "1.3.1"
2
+ __version__ = "2.0.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sarapy
3
- Version: 1.3.1
3
+ Version: 2.0.0
4
4
  Home-page: https://github.com/lucasbaldezzari/sarapy
5
5
  Author: Lucas Baldezzari
6
6
  Author-email: Lucas Baldezzari <lmbaldezzari@gmail.com>
@@ -19,6 +19,21 @@ Requires-Dist: geopy
19
19
 
20
20
  Library for processing SARAPICO project metadata of _AMG SA_.
21
21
 
22
+ #### Version 2.0.0
23
+
24
+ - Se realizan cambios en TransformInputData para que convierta los datos de telemetría a la forma de lista de diccionarios, como un JSON, para que sea más fácil de usar y entender. Además, a futuro, se espera que los datos de la electrónica se puedan enviar en este formato.
25
+ - Se realizan cambios en TLMSensorDataProcessor para que pueda recibir los datos de telemetría como una lista de diccionarios. La clase permite obtener los datos como un numpy array, o indexar por filas y columnas de forma similar a un DataFrame de pandas (de hecho se usa pandas para esto).
26
+ - Se generan cambios en PlantinFMCreator para que pueda recibir los datos de telemetría como una lista de diccionarios, y se usa TLMSensorDataProcessor para procesar los datos y obtener la matriz de características, la cual es la misma que antes.
27
+ - Se generan cambios en FertilizerTransformer para que pueda recibir los datos de telemetría como una lista de diccionarios, y se usa TLMSensorDataProcessor para procesar los datos y obtener la matriz de características, la cual es la misma que antes.
28
+ - Se generan cambios en OpsProcessor para poder trabajar con el formato nuevo de datos.
29
+
30
+ Los detalles de los cambios son comentados en el issue #37.
31
+
32
+ #### Version 1.4.0b1
33
+
34
+ - Se empieza a trabajar sobre librería estadística para poder detectar sensores saturados.
35
+ - Se empieza a trabajar sobre actualización para trabajar con los datos en la nueva modalidad luego de la migración.
36
+
22
37
  #### Version 1.3.1
23
38
 
24
39
  - Se modifica PlantinClassifier para tomar el umbral máximo de dst_pt en 4 y no en 7.
@@ -0,0 +1,29 @@
1
+ sarapy/__init__.py,sha256=aVoywqGSscYYDycLaYJnz08dlQabl9gH0h4Q5KtHM9o,74
2
+ sarapy/version.py,sha256=3Nibw-caFOXaxxpR0cMuStXOmzhpTadNBuz6NUKIZOI,51
3
+ sarapy/dataProcessing/GeoProcessor.py,sha256=ARjgKTXDVdf_cFCXyFmzlnmmmay3HG3q-yeJ9QrAcQU,5919
4
+ sarapy/dataProcessing/OpsProcessor.py,sha256=BglX1ZWxsmG6Li9oGzh1CKWtwxYELEBIzmg4B2u6C-o,16558
5
+ sarapy/dataProcessing/TLMSensorDataProcessor.py,sha256=RuITlryuSaIWvYyJwE5wxp85HVZ6mr5kUVALikfwS4g,3603
6
+ sarapy/dataProcessing/TimeSeriesProcessor.py,sha256=aig3A3_SCa9FVSWxGWiapBUX7Lj9Wi1BVyZi-XXZZYQ,6414
7
+ sarapy/dataProcessing/__init__.py,sha256=Kqs5sFtq6RMEa3KLJFbsGRoYsIxHL1UUGMuplyCyQFk,200
8
+ sarapy/mlProcessors/FertilizerFMCreator.py,sha256=LNi86CI6eVuQ0_UBVJNd_-L79fcY2-zY2NCm9ypl6OM,2354
9
+ sarapy/mlProcessors/FertilizerTransformer.py,sha256=PefMNrsvfqqjup0lcypzZB0IKzZbvTlTI03u4ITNuUo,3003
10
+ sarapy/mlProcessors/PlantinClassifier.py,sha256=PoPvtrqTXCmr0cLaMNRdDzhvzUJNZhLtvZNeE0qd_0Q,7905
11
+ sarapy/mlProcessors/PlantinFMCreator.py,sha256=meK8SH1rUlBOAfC4BPGUgpEIfgr-yXp9SwKdxVtmGo4,7035
12
+ sarapy/mlProcessors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
+ sarapy/preprocessing/DistancesImputer.py,sha256=NvbVAh5m0yFxVgDbEFnEX7RSG13qLjO7i2gqjDAWsf4,9106
14
+ sarapy/preprocessing/FertilizerImputer.py,sha256=zK6ONAilwPHvj-bC7yxnQYOkDBCCkWh6__57vYK9anM,1490
15
+ sarapy/preprocessing/TransformInputData.py,sha256=ETpeBp70G-MovA8R4vEYJ-DjvMNx3nF5_dPY9tBBrpM,8163
16
+ sarapy/preprocessing/TransformToOutputData.py,sha256=3AZWJUMqK52eySnLMJPbLan_sAukOcLhOvQgEqX-x98,3303
17
+ sarapy/preprocessing/__init__.py,sha256=Wg_Csy8Xiz8BN8A4-T7iPwcL_ol5ApEx6YtybItKB8M,100
18
+ sarapy/stats/__init__.py,sha256=ZrLMSistwynmmx4HUcI-ePRzqQ4bjp85JT4fTmbzC-c,27
19
+ sarapy/stats/stats.py,sha256=raQBnn2RRtwYOuKN4Mgk6Rhk4hajx1TVcGlYnT2TMmA,11412
20
+ sarapy/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
+ sarapy/utils/amg_decoder.py,sha256=JZ7cbu7DlCuatuq2F7aBfUr7S7U-K5poBgxw5nY6rNI,4319
22
+ sarapy/utils/amg_ppk.py,sha256=c0GusnxdntU-E0JOezzbIfC7SWoJmKAbad_zYDCJ3-c,1060
23
+ sarapy/utils/getRawOperations.py,sha256=8aA1fIkNCnUYgiWfnFggRT_U35z432gZBrZ7seGO5w4,817
24
+ sarapy/utils/plotting.py,sha256=kX-eYw618urMcUBkNPviQZdBziDc_TR3GInTsO90kU4,4065
25
+ sarapy-2.0.0.dist-info/LICENCE,sha256=N00sU3vSQ6F5c2vML9_qP4IFTkCPFFj0YGDB2CZP-uQ,840
26
+ sarapy-2.0.0.dist-info/METADATA,sha256=ui41pPndbaXIemLINNnNqM-pldrZ3uTcMT9tIqOSSHc,5388
27
+ sarapy-2.0.0.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
28
+ sarapy-2.0.0.dist-info/top_level.txt,sha256=4mUGZXfX2Fw47fpY6MQkaJeuOs_8tbjLkkNp34DJWiA,7
29
+ sarapy-2.0.0.dist-info/RECORD,,
@@ -1,26 +0,0 @@
1
- sarapy/__init__.py,sha256=aVoywqGSscYYDycLaYJnz08dlQabl9gH0h4Q5KtHM9o,74
2
- sarapy/version.py,sha256=1iLPpzVPQZ7V5v1UclFBnaF0jEl1KLqdxud9qvQDJVo,51
3
- sarapy/dataProcessing/GeoProcessor.py,sha256=ARjgKTXDVdf_cFCXyFmzlnmmmay3HG3q-yeJ9QrAcQU,5919
4
- sarapy/dataProcessing/OpsProcessor.py,sha256=XLCousbVeST-y4hjr27AKrg9-bOMTdkWl3fDJOgXFSM,18321
5
- sarapy/dataProcessing/TLMSensorDataProcessor.py,sha256=GfSIRYD_biFlOMTfSQSwW0HsUouZuUL3ScvL4uUHTPQ,23824
6
- sarapy/dataProcessing/TimeSeriesProcessor.py,sha256=-uic18Sut9yMCenbLO1-VabmKifKABt_FbCCP_fLcmE,5403
7
- sarapy/dataProcessing/__init__.py,sha256=Kqs5sFtq6RMEa3KLJFbsGRoYsIxHL1UUGMuplyCyQFk,200
8
- sarapy/mlProcessors/FertilizerFMCreator.py,sha256=LNi86CI6eVuQ0_UBVJNd_-L79fcY2-zY2NCm9ypl6OM,2354
9
- sarapy/mlProcessors/FertilizerTransformer.py,sha256=vdGNbvlmvtJZxr0oOE4Zb8Es-K-BKQh4oyhIGfDAcxQ,3571
10
- sarapy/mlProcessors/PlantinClassifier.py,sha256=PoPvtrqTXCmr0cLaMNRdDzhvzUJNZhLtvZNeE0qd_0Q,7905
11
- sarapy/mlProcessors/PlantinFMCreator.py,sha256=FeEz0MiorkMPodPgN9FtBDJ22WVLoLwK4g-CFI46DAk,8568
12
- sarapy/mlProcessors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
- sarapy/preprocessing/DistancesImputer.py,sha256=NvbVAh5m0yFxVgDbEFnEX7RSG13qLjO7i2gqjDAWsf4,9106
14
- sarapy/preprocessing/FertilizerImputer.py,sha256=zK6ONAilwPHvj-bC7yxnQYOkDBCCkWh6__57vYK9anM,1490
15
- sarapy/preprocessing/TransformInputData.py,sha256=wDwyg4U-jgTqvNUFngsmhSKwyhoIyVWlhezEhhPf2qE,4090
16
- sarapy/preprocessing/TransformToOutputData.py,sha256=rWAsZKWLxn1qtxUMV_cWeKs4dPkFcBEt6IqKL9A64js,3933
17
- sarapy/preprocessing/__init__.py,sha256=Wg_Csy8Xiz8BN8A4-T7iPwcL_ol5ApEx6YtybItKB8M,100
18
- sarapy/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- sarapy/utils/amg_decoder.py,sha256=JZ7cbu7DlCuatuq2F7aBfUr7S7U-K5poBgxw5nY6rNI,4319
20
- sarapy/utils/amg_ppk.py,sha256=c0GusnxdntU-E0JOezzbIfC7SWoJmKAbad_zYDCJ3-c,1060
21
- sarapy/utils/getRawOperations.py,sha256=8aA1fIkNCnUYgiWfnFggRT_U35z432gZBrZ7seGO5w4,817
22
- sarapy-1.3.1.dist-info/LICENCE,sha256=N00sU3vSQ6F5c2vML9_qP4IFTkCPFFj0YGDB2CZP-uQ,840
23
- sarapy-1.3.1.dist-info/METADATA,sha256=DoZmWAvCW8LCVj1gjNAMG_5SR1WlMaokH4BTC0bps7E,3892
24
- sarapy-1.3.1.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
25
- sarapy-1.3.1.dist-info/top_level.txt,sha256=4mUGZXfX2Fw47fpY6MQkaJeuOs_8tbjLkkNp34DJWiA,7
26
- sarapy-1.3.1.dist-info/RECORD,,
File without changes