Untitled

 avatar
unknown
plain_text
4 months ago
4.0 kB
2
Indexable
import os
import pandas as pd
from datetime import datetime, timedelta

class FileConcatenator:
    def __init__(self, input_folder, output_file, start_date, days_to_process, scenario_number_start):
        self.input_folder = input_folder
        self.output_file = output_file
        self.start_date = datetime.strptime(start_date, "%Y-%m-%d")
        self.days_to_process = days_to_process
        self.scenario_number_start = scenario_number_start

    def generate_weekdays(self):
        weekdays = []
        current_date = self.start_date
        while len(weekdays) < self.days_to_process:
            if current_date.weekday() < 5:  # Monday to Friday
                weekdays.append(current_date.strftime("%Y%m%d"))
            current_date -= timedelta(days=1)
        return weekdays

    def process_files(self):
        file_dates = self.generate_weekdays()
        concatenated_data = []
        files_processed = 0  # Contador para asegurar que procesamos exactamente 521 archivos

        for i, file_date in enumerate(file_dates):
            if files_processed >= self.days_to_process:  # Si ya hemos procesado 521 archivos, salimos del bucle
                break

            scenario_number = self.scenario_number_start - i

            # Buscar ficheros con la fecha en el nombre
            matching_files = [f for f in os.listdir(self.input_folder) if file_date in f]

            if not matching_files:
                # Si no se encuentran archivos para la fecha
                print(f"Fecha no incluida, verificar si es festivo: {file_date}")
                continue  # Pasar a la siguiente fecha si no se encuentra archivo

            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')

                # 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'
                ]]

                # Añadir al conjunto de datos concatenados
                concatenated_data.append(processed_data)
                files_processed += 1  # Incrementar el contador de archivos procesados

                # Si ya hemos procesado 521 archivos, salimos del bucle
                if files_processed >= self.days_to_process:
                    break

        return concatenated_data

    def save_to_csv(self, concatenated_data):
        final_df = pd.concat(concatenated_data, ignore_index=True)
        final_df.to_csv(self.output_file, index=False, sep='|')
        print(f"Proceso completado. Archivo concatenado guardado en {self.output_file}")

# Parámetros iniciales
input_folder = r'C:\Users\x528785\Downloads\OneDrive_1_13-12-2024'
output_file = r'C:\Users\x528785\Downloads\concatenated_file.csv'
start_date = "2024-11-29"
days_to_process = 521
scenario_number_start = 4.565

# Ejecutar la clase
concatenator = FileConcatenator(input_folder, output_file, start_date, days_to_process, scenario_number_start)
data = concatenator.process_files()
concatenator.save_to_csv(data)
Editor is loading...
Leave a Comment