sarapy 1.3.1__py3-none-any.whl → 2.1.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/dataProcessing/OpsProcessor.py +79 -118
- sarapy/dataProcessing/TLMSensorDataProcessor.py +73 -764
- sarapy/dataProcessing/TimeSeriesProcessor.py +19 -1
- sarapy/mlProcessors/FertilizerTransformer.py +16 -29
- sarapy/mlProcessors/PlantinFMCreator.py +39 -59
- sarapy/preprocessing/TransformInputData.py +123 -84
- sarapy/preprocessing/TransformToOutputData.py +16 -33
- sarapy/stats/__init__.py +1 -0
- sarapy/stats/stats.py +258 -0
- sarapy/utils/plotting.py +96 -0
- sarapy/version.py +1 -1
- {sarapy-1.3.1.dist-info → sarapy-2.1.0.dist-info}/METADATA +20 -1
- sarapy-2.1.0.dist-info/RECORD +29 -0
- sarapy-1.3.1.dist-info/RECORD +0 -26
- {sarapy-1.3.1.dist-info → sarapy-2.1.0.dist-info}/LICENCE +0 -0
- {sarapy-1.3.1.dist-info → sarapy-2.1.0.dist-info}/WHEEL +0 -0
- {sarapy-1.3.1.dist-info → sarapy-2.1.0.dist-info}/top_level.txt +0 -0
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)
|
sarapy/utils/plotting.py
ADDED
|
@@ -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.
|
|
2
|
+
__version__ = "2.1.0"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: sarapy
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 2.1.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,25 @@ Requires-Dist: geopy
|
|
|
19
19
|
|
|
20
20
|
Library for processing SARAPICO project metadata of _AMG SA_.
|
|
21
21
|
|
|
22
|
+
#### Version 2.1.0
|
|
23
|
+
|
|
24
|
+
- Se modifica TransformInputdata para poder obtener el timestamp en newSample de OpsProcessor. Se modifica transformOutputData para entregar los datos en base a la solicitud de #43. Se modifica OpsProcessor para poder obtener los datos de salida según solicitud en #43. Close #43.
|
|
25
|
+
|
|
26
|
+
#### Version 2.0.0
|
|
27
|
+
|
|
28
|
+
- 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.
|
|
29
|
+
- 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).
|
|
30
|
+
- 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.
|
|
31
|
+
- 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.
|
|
32
|
+
- Se generan cambios en OpsProcessor para poder trabajar con el formato nuevo de datos.
|
|
33
|
+
|
|
34
|
+
Los detalles de los cambios son comentados en el issue #37.
|
|
35
|
+
|
|
36
|
+
#### Version 1.4.0b1
|
|
37
|
+
|
|
38
|
+
- Se empieza a trabajar sobre librería estadística para poder detectar sensores saturados.
|
|
39
|
+
- Se empieza a trabajar sobre actualización para trabajar con los datos en la nueva modalidad luego de la migración.
|
|
40
|
+
|
|
22
41
|
#### Version 1.3.1
|
|
23
42
|
|
|
24
43
|
- 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=Mggl7XGGseYHWRAVliZYoEOj2Nt43ALrs5sSYbS8DK4,51
|
|
3
|
+
sarapy/dataProcessing/GeoProcessor.py,sha256=ARjgKTXDVdf_cFCXyFmzlnmmmay3HG3q-yeJ9QrAcQU,5919
|
|
4
|
+
sarapy/dataProcessing/OpsProcessor.py,sha256=zu6AJ2wQD84-u-fxxTIqGbdw4NrRRye9gHZO3A8Z724,17269
|
|
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=ZQ8k_4JFp78G5VqZEuzYmF8VCDcOxEnHKbd_4w7PPjY,8536
|
|
16
|
+
sarapy/preprocessing/TransformToOutputData.py,sha256=xXFRTwpv-R2duG4ixOVBLojHc0z3FD_l5gRzinF4DQc,3143
|
|
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.1.0.dist-info/LICENCE,sha256=N00sU3vSQ6F5c2vML9_qP4IFTkCPFFj0YGDB2CZP-uQ,840
|
|
26
|
+
sarapy-2.1.0.dist-info/METADATA,sha256=SUxMaAystOQGL48pzY351JHV6JgnZkiw5yhNJEqZ1RY,5695
|
|
27
|
+
sarapy-2.1.0.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
|
|
28
|
+
sarapy-2.1.0.dist-info/top_level.txt,sha256=4mUGZXfX2Fw47fpY6MQkaJeuOs_8tbjLkkNp34DJWiA,7
|
|
29
|
+
sarapy-2.1.0.dist-info/RECORD,,
|
sarapy-1.3.1.dist-info/RECORD
DELETED
|
@@ -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
|
|
File without changes
|
|
File without changes
|