Untitled

 avatar
unknown
plain_text
5 months ago
5.3 kB
3
Indexable
import pandas as pd

def process_csv(file_path, output_path):
    # Wczytanie pliku CSV z odpowiednim kodowaniem i ignorowaniem błędnych linii
    df = pd.read_csv(file_path, encoding='ISO-8859-1', on_bad_lines='skip', delimiter=';')

    # Wyświetlenie dostępnych kolumn
    print("Available columns:", df.columns)

    # Sprawdzenie czy kolumna "Data" istnieje
    if 'Data' in df.columns:
        # Zmiana formatu daty w kolumnie "Data"
        df['Data'] = pd.to_datetime(df['Data'], format='%d-%m-%Y, %H:%M:%S').dt.date
    else:
        print("Kolumna 'Data' nie istnieje w pliku CSV.")
        return

    # Sprawdzanie czy wymagane kolumny istnieją
    required_columns = ['zamowienie', 'status', 'Nazwa paczki', 'miejscowosc', 'krok']
    for col in required_columns:
        if col not in df.columns:
            print(f"Kolumna '{col}' nie istnieje w pliku CSV.")
            return

    # Filtrowanie danych w kolumnie "zamowienie"
    df_filtered = df[
        (df['zamowienie'].isin(['www nowe', 'mmp nowe'])) &
        (df['status'].str.lower().str.startswith('nieuko')) &  # Szuka wartości zaczynających się od "nieuko"
        (
            df['Nazwa paczki'].str.contains('INT', na=False) |
            df['Nazwa paczki'].str.contains('K Vectra', na=False) |
            df['Nazwa paczki'].str.contains('K Int Mobi', na=False) |
            df['Nazwa paczki'].str.contains('MVNO', na=False) |
            (df['Nazwa paczki'].str.contains('DTV', na=False) & ~df['Nazwa paczki'].str.contains('INT', na=False))
        )
    ]

    # Sprawdzenie czy filtr zwrócił dane
    if df_filtered.empty:
        print("Brak danych po filtracji.")
        return

    # Znalezienie wartości paczek w każdej kategorii
    category_conditions = {
        'INT': df_filtered['Nazwa paczki'].str.contains('INT', na=False),
        'K Vectra': df_filtered['Nazwa paczki'].str.contains('K Vectra', na=False),
        'K Int Mobi': df_filtered['Nazwa paczki'].str.contains('K Int Mobi', na=False),
        'MVNO': df_filtered['Nazwa paczki'].str.contains('MVNO', na=False),
        'DTV (bez INT)': df_filtered['Nazwa paczki'].str.contains('DTV', na=False) & ~df_filtered['Nazwa paczki'].str.contains('INT', na=False)
    }

    # Przygotowanie tabeli wynikowej z liczbą powtórzeń dla każdej kategorii
    result_data = []
    detailed_data = {}
    location_data = {}
    krok_data = {}

    for category, condition in category_conditions.items():
        # Zliczanie liczby powtórzeń dla każdej paczki w kategorii
        category_df = df_filtered[condition]
        category_count = category_df.shape[0]
        result_data.append({'Kategoria': category, 'Liczba powtórzeń': category_count})

        # Zliczanie powtórzeń dla każdej unikalnej "Nazwa paczki"
        detailed_counts = category_df['Nazwa paczki'].value_counts()
        detailed_data[category] = detailed_counts.reset_index()
        detailed_data[category].columns = ['Nazwa paczki', 'Liczba powtórzeń']

        # Zliczanie liczby wystąpień dla każdej miejscowości per produkt
        location_counts = category_df['miejscowosc'].value_counts()
        location_data[category] = location_counts.reset_index()
        location_data[category].columns = ['Miejscowosc', 'Liczba powtórzeń']

        # Filtr w kolumnie "krok"
        krok_condition = (
            category_df['krok'].str.contains('weryfikacja/podawanie danych', na=False) |
            category_df['krok'].str.contains('podsumowanie', na=False) |
            category_df['krok'].str.startswith('um', na=False)  # Szukanie kroków zaczynających się od "um"
        )
        
        krok_counts = category_df[krok_condition]['krok'].value_counts()
        krok_data[category] = krok_counts.reset_index()
        krok_data[category].columns = ['Krok', 'Liczba powtórzeń']

    # Konwersja do DataFrame
    result_df = pd.DataFrame(result_data)

    # Zapisanie do Excela za pomocą 'openpyxl'
    with pd.ExcelWriter(output_path, engine='openpyxl') as writer:
        # Zapisanie ogólnego podsumowania
        result_df.to_excel(writer, sheet_name='Podsumowanie', index=False)

        # Zapisanie szczegółowych danych dla każdej kategorii w osobnych arkuszach
        for category, data in detailed_data.items():
            data.to_excel(writer, sheet_name=category, index=False)

        # Zapisanie danych miejscowości w nowym arkuszu
        for category, location_df in location_data.items():
            location_df.to_excel(writer, sheet_name=f'{category}_Miejscowosci', index=False)

        # Dodanie danych z kolumny "krok" do zakładki "Podsumowanie" pod istniejącą tabelą
        worksheet = writer.sheets['Podsumowanie']
        start_row = result_df.shape[0] + 3  # Po istniejącej tabeli, z odstępem 3 wierszy
        
        # Zapisujemy dane z "krok" dla każdej kategorii osobno
        for category, krok_df in krok_data.items():
            worksheet.cell(start_row, 1, f"Kategoria: {category}")  # Nazwa kategorii
            krok_df.to_excel(writer, sheet_name='Podsumowanie', startrow=start_row + 1, index=False, header=True)
            start_row += krok_df.shape[0] + 3  # Zwiększamy wiersz dla kolejnych kategorii

    print(f"Plik został zapisany jako {output_path}")

# Przykład użycia
process_csv('input.csv', 'output.xlsx')
Editor is loading...
Leave a Comment