building-analysis-ai / scripts /model_dataset_analysis.py
kuhs's picture
Upload folder using huggingface_hub
628a672 verified
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}")