Skip to content

Commit

Permalink
code comments
Browse files Browse the repository at this point in the history
  • Loading branch information
bhcaceres committed Apr 2, 2024
1 parent d3e4511 commit 8d751a8
Showing 1 changed file with 23 additions and 12 deletions.
35 changes: 23 additions & 12 deletions resources/src/server/forecast.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import time


def read_json(ruta, frecuencia='H'):
def read_json(ruta, gran):

# ruta: ruta del archivo json

Expand All @@ -26,15 +26,14 @@ def read_json(ruta, frecuencia='H'):
df.set_index('timestamp', inplace=True)

# Especificar la frecuencia del índice según la granularidad elegida
df = df.asfreq(frecuencia) # Rellena con datos NaN si falta algún tiempo
df = df.asfreq(gran) # Rellena con datos NaN si falta algún tiempo

return df

def granularity_to_minutes(granularity):
"""
Get the number of seconds for each possible druid
granularity. For example, "pt2m" would return 120
and "thirty_minute" would return 1800.
Get the number of minutes for each possible druid
granularity.
Args:
-granularity (string): druid granularity.
Expand Down Expand Up @@ -63,6 +62,7 @@ def granularity_to_minutes(granularity):
raise ValueError(error_msg)
return (numbers * multiplier / 60)


def plot_forecast(y, y_pred):
labels = ['y', 'y_pred']
plt.figure(figsize=(10, 6))
Expand All @@ -79,21 +79,32 @@ def plot_forecast(y, y_pred):


def predict(data, gran):
'''
data: serie temporal para hacer el forecast (con una columna de timestamp y otra columna con los valores a predecir)
gran: granularidad utilizada (H: hora, 2H: 2 horas, 8H: 8 horas, D: día)
NO FUNCIONA PARA GRANULARIDADES MENORES A UNA HORA (consume muchos recursos)
'''
print(gran)
gran = granularity_to_minutes(gran)
gran = granularity_to_minutes(gran) # Obtenemos la granularidad en minutos (H = 60, 2H = 120, etc)
print(gran)
y = data.iloc[-int(20160/gran):] # últimas 2 semanas
sp = 10080/gran
fh = np.arange(1, 20) # horizonte de predicción
y = data.iloc[-int(20160/gran):] # últimas 2 semanas (2 semanas = 20160 minutos)
sp = 10080/gran # Seasonality Period, lo fijamos a 1 semana (1 semana = 10080 minutos)
fh = np.arange(1, 60) # horizonte de predicción (en este caso 20 puntos en el tiempo hacia delante, se puede cambiar)

y = y.interpolate(method='linear') # interpolación lineal para imputar datos faltantes
forecaster = SARIMAX(order=(0, 1, 0), seasonal_order=(0, 1, 1, sp))
forecaster = SARIMAX(order=(0, 1, 0), seasonal_order=(0, 1, 1, sp)) # Modelo SARIMAX
forecaster.fit(y)
y_pred = forecaster.predict(fh)
y_pred = forecaster.predict(fh) # Se obtienen las predicciones

return y_pred


def __main__(file, gran, aggr):
'''
file: ruta hacia un archivo json con los datos
gran: granularidad (H: hora, 2H: 2 horas, 8H: 8 horas, D: día)
aggr: agregación que se va a utilizar para la predicción (bytes, pkts, etc)
'''
df = read_json(file, gran)
print(df)
data = df[f"result.{aggr}"]
Expand All @@ -105,4 +116,4 @@ def __main__(file, gran, aggr):
print('Time:', fin-inicio)
plot_forecast(data, y_pred)

__main__('<file name>', '<gran>', 'bytes')
__main__('/home/bhcaceres/Downloads/data_60.json', 'H', 'bytes')

0 comments on commit 8d751a8

Please sign in to comment.