Untitled

 avatar
unknown
plain_text
4 months ago
3.7 kB
4
Indexable
def process_files(self):
    file_dates = self.generate_weekdays()
    concatenated_data = []
    processed_files_count = 0
    not_matching_files = []
    
    current_date = self.start_date

    while processed_files_count < self.days_to_process:
        if len(file_dates) == 0:
            # Generar días adicionales para rellenar el déficit
            while len(file_dates) < self.days_to_process - processed_files_count:
                current_date -= timedelta(days=1)
                if current_date.weekday() < 5:  # Lunes a Viernes
                    file_dates.append(current_date.strftime("%Y%m%d"))

        file_date = file_dates.pop(0)
        matching_files = [f for f in os.listdir(self.input_folder) if file_date in f]

        if matching_files:
            for file in matching_files:
                file_path = os.path.join(self.input_folder, file)

                # Leer el fichero como CSV
                df = pd.read_csv(file_path, sep='\t', engine='python')

                # Calcular el número de escenario con 3 decimales
                scenario_number = f"{self.scenario_number_start - (processed_files_count * 0.001):.3f}"

                # Seleccionar y renombrar las columnas según las equivalencias
                processed_data = df.assign(
                    **{
                        'Scenario Number': scenario_number,
                        'Instrument Label': df['DISPLAYED'],
                        'Market Label': df['MARKET'],
                        'Maturity Label': '',
                        'Quotation Mode': 'YIELD',
                        'Shift Type': 'Std',
                        'Shift Value': df['YIELD'],
                        'Initial Value': '',
                        'Router': ''
                    }
                )

                # Seleccionar solo las columnas necesarias
                processed_data = processed_data[[
                    'Scenario Number', 'Instrument Label', 'Market Label', 'Maturity Label',
                    'Quotation Mode', 'Shift Type', 'Shift Value', 'Initial Value', 'Router'
                ]]

                concatenated_data.append(processed_data)
                processed_files_count += 1

        else:
            not_matching_files.append(file_date)
            print(f"No se encontró archivo para la fecha: {file_date}. Verificar si es festivo.")

    # Unir todos los datos procesados
    final_df = pd.concat(concatenated_data, ignore_index=True)

    # Asegurarse de que cada "Instrument Label" tenga 521 registros
    completed_data = []
    for instrument_label, group in final_df.groupby('Instrument Label'):
        if len(group) < self.days_to_process:
            # Ordenar por fecha (u otra columna si es necesario)
            group = group.sort_values(by='Scenario Number')
            # Repetir la fila más antigua hasta completar 521 registros
            missing_count = self.days_to_process - len(group)
            oldest_row = group.iloc[0]
            repeated_rows = pd.DataFrame([oldest_row] * missing_count)
            group = pd.concat([group, repeated_rows], ignore_index=True)
        completed_data.append(group)

    # Combinar todos los datos en un DataFrame final
    final_df = pd.concat(completed_data, ignore_index=True)

    # Imprimir resultados de depuración
    print(f"Archivos procesados correctamente: {processed_files_count}")
    print(f"Fechas sin archivos coincidentes: {len(not_matching_files)}")
    print(f"Fechas sin archivos coincidentes (detalles): {not_matching_files}")
    
    return final_df
Editor is loading...
Leave a Comment