reddgr commited on
Commit
119d3b4
·
1 Parent(s): 0de5054

minor fixes

Browse files
Files changed (1) hide show
  1. src/front_dataset_handler.py +24 -9
src/front_dataset_handler.py CHANGED
@@ -8,7 +8,7 @@ import json
8
 
9
  class FrontDatasetHandler:
10
  def __init__(self, maestro: pd.DataFrame=None, precios_cierre: pd.DataFrame=None, app_dataset: pd.DataFrame=None,
11
- json_path: str = None, pickle_path: str = None):
12
  self.maestro = maestro
13
  self.app_dataset = app_dataset # Dataframe preprocesado para la app
14
  self.pickle_path = pickle_path
@@ -28,6 +28,11 @@ class FrontDatasetHandler:
28
  num_maps = json.load(f)
29
  self.sector_num_map = num_maps['sector_num_map']
30
  self.industry_num_map = num_maps['industry_num_map']
 
 
 
 
 
31
 
32
  self.norm_columns = None
33
  if maestro is not None:
@@ -46,8 +51,15 @@ class FrontDatasetHandler:
46
  self.precios_cierre.columns.name = 'ticker'
47
  end_date = self.precios_cierre.index.max()
48
  start_date = end_date - pd.Timedelta(days=n_dias)
 
 
 
 
 
 
 
49
 
50
- # Filtrar datos dentro del rango de fechas
51
  precios_cierre_fh = self.precios_cierre.loc[start_date:end_date].copy()
52
 
53
  # Descartar los últimos n_dias_descartar
@@ -63,14 +75,17 @@ class FrontDatasetHandler:
63
 
64
  def calcula_rendimientos_y_volatilidad(self, n_dias=365, umbral_max=0.3, umbral_min=-0.3):
65
  end_date = self.precios_cierre.index.max()
 
 
66
  start_date = end_date - pd.Timedelta(days=n_dias)
67
- # Dado que la tabla no siempre incluye fechas de fin de semana o festivos, se busca la fecha más cercana anterior a start_date
68
  if start_date not in self.precios_cierre.index:
69
- previous_dates = self.precios_cierre.index[self.precios_cierre.index < start_date]
70
- if len(previous_dates) > 0:
71
- start_date = previous_dates.max()
72
  else:
73
- raise ValueError(f"No hay datos históricos suficientes ({n_dias}, {end_date})")
 
74
  _df_rend_y_vol = self.precios_cierre.loc[start_date:end_date].copy()
75
 
76
  _df_rend_y_vol.dropna(how='all', inplace=True) #####
@@ -366,10 +381,10 @@ class FrontDatasetHandler:
366
  if self.app_dataset is not None:
367
  print("app_dataset already exists, skipping processing")
368
  return
369
-
370
  self.filtra_y_homogeneiza(n_dias=periodo, n_dias_descartar=n_dias_descartar, min_dias=min_dias)
371
 
372
- for periodo_metricas in periodos_metricas:
373
  self.calcula_rendimientos_y_volatilidad(n_dias=periodo_metricas, umbral_max=umbrales_rend[1], umbral_min=umbrales_rend[0])
374
  self.cruza_maestro()
375
  self.var_categorica_a_numerica(cat_cols)
 
8
 
9
  class FrontDatasetHandler:
10
  def __init__(self, maestro: pd.DataFrame=None, precios_cierre: pd.DataFrame=None, app_dataset: pd.DataFrame=None,
11
+ json_path: str = None, pickle_path: str = None, ignore_columns: list = None, numeric_columns: list = None):
12
  self.maestro = maestro
13
  self.app_dataset = app_dataset # Dataframe preprocesado para la app
14
  self.pickle_path = pickle_path
 
28
  num_maps = json.load(f)
29
  self.sector_num_map = num_maps['sector_num_map']
30
  self.industry_num_map = num_maps['industry_num_map']
31
+ else:
32
+ self.ignore_columns = ignore_columns
33
+ self.numeric_columns = numeric_columns
34
+ print(f"ignore_columns: {self.ignore_columns}")
35
+ print(f"numeric_columns: {self.numeric_columns}")
36
 
37
  self.norm_columns = None
38
  if maestro is not None:
 
51
  self.precios_cierre.columns.name = 'ticker'
52
  end_date = self.precios_cierre.index.max()
53
  start_date = end_date - pd.Timedelta(days=n_dias)
54
+ # If start_date is not in the index, find the nearest earlier date
55
+ if start_date not in self.precios_cierre.index:
56
+ earlier_dates = self.precios_cierre.index[self.precios_cierre.index < start_date]
57
+ if len(earlier_dates) > 0:
58
+ start_date = earlier_dates.max()
59
+ else:
60
+ start_date = self.precios_cierre.index.min()
61
 
62
+ # Filtrar datos dentro del rango de fechas
63
  precios_cierre_fh = self.precios_cierre.loc[start_date:end_date].copy()
64
 
65
  # Descartar los últimos n_dias_descartar
 
75
 
76
  def calcula_rendimientos_y_volatilidad(self, n_dias=365, umbral_max=0.3, umbral_min=-0.3):
77
  end_date = self.precios_cierre.index.max()
78
+ print(f"Última fecha: {end_date}")
79
+ print("Primera fecha: ",self.precios_cierre.index.min())
80
  start_date = end_date - pd.Timedelta(days=n_dias)
81
+ # Si no hay cotizaciones para la fecha de inicio calculada (ej. fin de semana), se cambia por la fecha más cercana
82
  if start_date not in self.precios_cierre.index:
83
+ earlier_dates = self.precios_cierre.index[self.precios_cierre.index < start_date]
84
+ if len(earlier_dates) > 0:
85
+ start_date = earlier_dates.max()
86
  else:
87
+ start_date = self.precios_cierre.index.min()
88
+
89
  _df_rend_y_vol = self.precios_cierre.loc[start_date:end_date].copy()
90
 
91
  _df_rend_y_vol.dropna(how='all', inplace=True) #####
 
381
  if self.app_dataset is not None:
382
  print("app_dataset already exists, skipping processing")
383
  return
384
+
385
  self.filtra_y_homogeneiza(n_dias=periodo, n_dias_descartar=n_dias_descartar, min_dias=min_dias)
386
 
387
+ for periodo_metricas in periodos_metricas:
388
  self.calcula_rendimientos_y_volatilidad(n_dias=periodo_metricas, umbral_max=umbrales_rend[1], umbral_min=umbrales_rend[0])
389
  self.cruza_maestro()
390
  self.var_categorica_a_numerica(cat_cols)