from collections import defaultdict, Counter import pandas as pd from itertools import combinations import os from pathlib import Path from dotenv import load_dotenv """ run: python -m scripts.model_dataset_analysis """ PROJECT_ROOT = Path(__file__).resolve().parents[1] load_dotenv(PROJECT_ROOT / ".env") #input dataset has path defined in .env file as OUTPUT_DATASET_PATH INPUT_DATASET = os.getenv("OUTPUT_DATASET_PATH") # Constants for reading the dataset SHEET_NAME = "Sheet1" # Set to your actual sheet name HEADER_ROW_INDEX = 0 # Set to your actual header row index def analyze_dataset(dataset_path): # Read the dataset df = pd.read_excel(dataset_path, sheet_name=SHEET_NAME, header=HEADER_ROW_INDEX) #for every atribute show the most common values and their names for column in df.columns: print(f"Column: {column}") print(df[column].value_counts().head(5)) # Show top 5 most common values print("\n") # Analyze combinations of attributes combo_counter = Counter() for _, row in df.iterrows(): # Create a tuple of the attribute values for the current row, filling NaN values with "N/A" combo = tuple(row.fillna("N/A")) combo_counter[combo] += 1 combo_df = pd.DataFrame(combo_counter.items(), columns=['Combination', 'Count']) return combo_df def get_combinations(df, cols): return ( df[cols] .fillna("NaN") .groupby(cols, as_index=False) .size() .rename(columns={"size": "Count"}) .sort_values(by=cols[0], ascending=False) ) if __name__ == "__main__": dataset_path = os.path.join(INPUT_DATASET) df = pd.read_excel(dataset_path, sheet_name=SHEET_NAME, header=HEADER_ROW_INDEX) # remove 'EGID' column for analysis if "EGID" in df.columns: df = df.drop(columns=['EGID']) df["BAUJAHR_GRUPPE"] = df["BAUJAHR"].apply( lambda x: "vor_1990" if x <= 1990 else "nach_1990" ) df["BAUPERIODE_PERIOD"] = df["BAUJAHR"].apply( lambda x: "vor_1900" if x < 1900 else ("1901-1950" if x <= 1950 else ("1951-1990" if x <= 1990 else "nach_1990")) ) # To DO: analyse and remove unnecessary combinations with no real value analysen = { # baujahr analysieren "baujahr_gr": ["BAUJAHR_GRUPPE"], "baujahr_p": ["BAUPERIODE_PERIOD"], "baujahr_fassade_schad": ["BAUPERIODE_PERIOD", "FASSADE_BEKLEIDUNG", "SCHADSTOFFEN"], "baujahr_fenster_schad": ["BAUPERIODE_PERIOD", "FENSTER", "SCHADSTOFFEN"], # schadstoffen analysieren "schad_Baujahr_gr": ["SCHADSTOFFEN", "BAUJAHR_GRUPPE"], "schad_Baujahr_p": ["SCHADSTOFFEN", "BAUPERIODE_PERIOD"], "schad_fassaden_bekleidung": ["SCHADSTOFFEN", "FASSADE_BEKLEIDUNG"], "schad_fassaden_daemmung": ["SCHADSTOFFEN", "FASSADE_DAEMMUNG"], "schad_dach_bekleidung": ["SCHADSTOFFEN", "DACH_BEKLEIDUNG"], "schad_dach_konstruktion": ["SCHADSTOFFEN", "KONSTRUKTION_DACH"], "schad_fenster": ["SCHADSTOFFEN", "FENSTER"], "schadstoffen_eterni": ["SCHADSTOFFEN", "ETERNIT"], # fassaden analysieren tragwerk "fassaden_Baujahr_gr": ["TRAGWERK_FASSADE", "BAUJAHR_GRUPPE"], "fassaden_Baujahr_p": ["TRAGWERK_FASSADE", "BAUPERIODE_PERIOD"], #"fassade_holz": ["TRAGWERK_FASSADE", "HOLZ"], "fassade_stahl": ["TRAGWERK_FASSADE", "STAHL"], "fassade_blech": ["TRAGWERK_FASSADE", "STAHLBLECH"], #"fassade_beton": ["TRAGWERK_FASSADE", "BETON"], "fassade_hauptnutzung": ["TRAGWERK_FASSADE", "HAUPTNUTZUNG"], "fassade_Nutzung": ["TRAGWERK_FASSADE", "NUTZUNG"], # fassaden analysieren dämmung "fassaden_tragwerk_daemmung": ["TRAGWERK_FASSADE", "FASSADE_DAEMMUNG"], # tragwerk, dämmung und baujahr sind evt. stark abhängig -> gute erkenntnisse "fassaden_tragwerk_daemmung_j_gr": ["TRAGWERK_FASSADE", "FASSADE_DAEMMUNG", "BAUJAHR_GRUPPE"], "fassaden_daemmung_j_gr": ["FASSADE_DAEMMUNG", "BAUJAHR_GRUPPE"], #"fassaden_daemmung_bekleidung": ["FASSADE_DAEMMUNG", "FASSADE_BEKLEIDUNG"], "fassaden_daemmung_dach_b": ["FASSADE_DAEMMUNG", "DACH_BEKLEIDUNG"], "fassaden_daemmung_dach_k": ["FASSADE_DAEMMUNG", "KONSTRUKTION_DACH"], "fassaden_daemmung_fenster": ["FASSADE_DAEMMUNG", "FENSTER"], "fassaden_daemmung_boden": ["FASSADE_DAEMMUNG", "BODENAUFBAU"], "fassaden_daemmung_hauptnutzung": ["FASSADE_DAEMMUNG", "HAUPTNUTZUNG"], # fassaden analysieren bekleidung "fassaden_bekleidung_j_gr": ["FASSADE_BEKLEIDUNG", "BAUJAHR_GRUPPE"], "fassaden_bekleidung_j_p": ["FASSADE_BEKLEIDUNG", "BAUPERIODE_PERIOD"], #"fassaden_bekleidung_holz": ["FASSADE_BEKLEIDUNG", "HOLZ"], #"fassaden_bekleidung_stahl": ["FASSADE_BEKLEIDUNG", "STAHL"], #"fassaden_bekleidung_beton": ["FASSADE_BEKLEIDUNG", "BETON"], #"fassaden_bekleidung_blech": ["FASSADE_BEKLEIDUNG", "STAHLBLECH"], # dach analysieren konstruktion "dach_Baujahr_gr": ["KONSTRUKTION_DACH", "BAUJAHR_GRUPPE"], "dach_Baujahr_p": ["KONSTRUKTION_DACH", "BAUPERIODE_PERIOD"], "dach_konstruktion_bekleidung": ["KONSTRUKTION_DACH", "DACH_BEKLEIDUNG"], #"dach_konstruktion_tragwerk": ["KONSTRUKTION_DACH", "TRAGWERK_FASSADE"], "dach_konstruktion_holz": ["KONSTRUKTION_DACH", "HOLZ"], #"dach_konstruktion_stahl": ["KONSTRUKTION_DACH", "STAHL"], # dach analysieren bekleidung "dach_Baujahr_gr_bekleidung": ["DACH_BEKLEIDUNG", "BAUJAHR_GRUPPE"], "dach_Baujahr_p_bekleidung": ["DACH_BEKLEIDUNG", "BAUPERIODE_PERIOD"], #"dach_bekleidung_holz": ["DACH_BEKLEIDUNG", "HOLZ"], #"dach_bekleidung_stahl": ["DACH_BEKLEIDUNG", "STAHL"], #"dach_bekleidung_beton": ["DACH_BEKLEIDUNG", "BETON"], #"dach_bekleidung_blech": ["DACH_BEKLEIDUNG", "STAHLBLECH"], # konstruktion decke "decke_Baujahr_gr": ["KONSTRUKTION_DECKE", "BAUJAHR_GRUPPE"], "decke_Baujahr_p": ["KONSTRUKTION_DECKE", "BAUPERIODE_PERIOD"], #"decke_konstruktion_holz": ["KONSTRUKTION_DECKE", "HOLZ"], #"decke_konstruktion_stahl": ["KONSTRUKTION_DECKE", "STAHL"], #"decke_konstruktion_beton": ["KONSTRUKTION_DECKE", "BETON"], #"decke_konstruktion_blech": ["KONSTRUKTION_DECKE", "STAHLBLECH"], #bodenaufbau analysieren "boden_Baujahr_gr": ["BODENAUFBAU", "BAUJAHR_GRUPPE"], "boden_Baujahr_p": ["BODENAUFBAU", "BAUPERIODE_PERIOD"], "boden_tragwerk_fassade": ["BODENAUFBAU", "TRAGWERK_FASSADE"], "boden_aufb_daemmung": ["BODENAUFBAU", "FASSADE_DAEMMUNG"], "boden_aufb_bekleidung": ["BODENAUFBAU", "FASSADE_BEKLEIDUNG"], "boden_aufb_fenster": ["BODENAUFBAU", "FENSTER"], # fenster analysieren "fenster_Baujahr_gr": ["FENSTER", "BAUJAHR_GRUPPE"], "fenster_Baujahr_p": ["FENSTER", "BAUPERIODE_PERIOD"], "fenster_tragwerk_fassade": ["FENSTER", "TRAGWERK_FASSADE"], "fenster_daemmung": ["FENSTER", "FASSADE_DAEMMUNG"], } results = {} for name, cols in analysen.items(): results[name] = get_combinations(df, cols) #a = analyze_dataset(dataset_path) #print(a.head(10)) #save the combination analysis to a new Excel file output_path = os.path.join(PROJECT_ROOT / "prediction_model", "var_combinations.xlsx") with pd.ExcelWriter(output_path) as writer: for name, combo_df in results.items(): combo_df.to_excel(writer, sheet_name=name, index=False) print(f"Combination analysis saved to {output_path}")