From 288225eeef618c8ac49cb8e308dd89624f125020 Mon Sep 17 00:00:00 2001 From: Kristofers Solo Date: Sun, 25 Feb 2024 00:44:11 +0200 Subject: [PATCH] feat: add correlation func (not working) --- src/main.py | 90 +++++++++++++++++++++++++------------ src/question/correlation.py | 33 ++++++++++++++ 2 files changed, 95 insertions(+), 28 deletions(-) create mode 100644 src/question/correlation.py diff --git a/src/main.py b/src/main.py index e92d4d9..72765a4 100755 --- a/src/main.py +++ b/src/main.py @@ -1,10 +1,12 @@ #!/usr/bin/env python +import itertools from pathlib import Path from typing import Optional import matplotlib.pyplot as plt import pandas as pd -from question import checkbox +from question import checkbox, correlation +from question.correlation import Combination BASE_DIR = Path(__file__).resolve().parent.parent FILE_PATH = BASE_DIR / "data" / "responses.csv" @@ -15,43 +17,75 @@ def read_data(filename: Path) -> pd.DataFrame: return pd.read_csv(filename) -QUESTIONS = { - "b": "Es plānoju samazināt pārtikas atkritumus mājsaimniecībā", - "c": "Kādā veidā Jūs samaziniet savu atkritumu daudzumu?", - "d": "Ražotu dzērienu vietā (limonādes, ūdens pudelēs, alkoholiskie dzērieni) es dzeršu krāna ūdeni.", - "e": "Kāda ir Jūsu uztura izvēle?", - "f": "Kuras no sekojošām rīcībām Jūs būtu gatavi veikt?", - "h": "Kāda veida transportlīdzekļus Jūs izmantojat?", - "i": "Ja esat automašīnas īpašnieks, kuru no minētajām iespējām Jūs izvēlētos, lai būtu videi draudzīgāks?", - "k": "Kurš no sekojošiem apgalvojumiem Jums ir tuvāks?", - "l": "Kuras no sekojošām darbībām Jūs pārsvarā veicat ar informācijas un komunikācijas tehnoloģiju (IKT) ierīcēm (telefona, datora, televizora u.c.) un to lietošanu?", - "m": "Kādas darbības Jūs mēģinat veikt, lai samazinātu enerģijas patēriņu?", - "o": "Kādā mājokļa tipā Jūs dzīvojat?", - "q": "Vai Jūs atteiktos no liekas mājokļa platības?", - "s": "Vai Jūsu dzīvesvieta ir papildus nosiltināta?", - "u": "Kurš no apgalvojumiem atbilst Jūsu dzīves situācijai?", - "v": "Kurš no šiem apgalvojumiem ir patiess par Jūsu mājdzīvniekiem?", - "w": "Kurš no apgalvojumiem par pārvietošanos brīvdienās un atvaļinājumos Jums ir patiess?", - "y": "Kurš no šiem apgalvojumiem par apģērbu un apavu iegādi attiecas uz Jums?", - "z": "Kurš no apgalvojumiem par Jums ir patiess?", -} - - def individual_charts(data: pd.DataFrame) -> None: - for column, question in QUESTIONS.items(): - checkbox.draw(data, question=question, filename=EXPORT_DIR / "individual" / f"{column}.png") - - -def correlation_charts(data: pd.DataFrame) -> None: + QUESTIONS: dict[str, str] = { + "b": "Es plānoju samazināt pārtikas atkritumus mājsaimniecībā", + "c": "Kādā veidā Jūs samaziniet savu atkritumu daudzumu?", + "d": "Ražotu dzērienu vietā (limonādes, ūdens pudelēs, alkoholiskie dzērieni) es dzeršu krāna ūdeni.", + "e": "Kāda ir Jūsu uztura izvēle?", + "f": "Kuras no sekojošām rīcībām Jūs būtu gatavi veikt?", + "h": "Kāda veida transportlīdzekļus Jūs izmantojat?", + "i": "Ja esat automašīnas īpašnieks, kuru no minētajām iespējām Jūs izvēlētos, lai būtu videi draudzīgāks?", + "k": "Kurš no sekojošiem apgalvojumiem Jums ir tuvāks?", + "l": "Kuras no sekojošām darbībām Jūs pārsvarā veicat ar informācijas un komunikācijas tehnoloģiju (IKT) ierīcēm (telefona, datora, televizora u.c.) un to lietošanu?", + "m": "Kādas darbības Jūs mēģinat veikt, lai samazinātu enerģijas patēriņu?", + "o": "Kādā mājokļa tipā Jūs dzīvojat?", + "q": "Vai Jūs atteiktos no liekas mājokļa platības?", + "s": "Vai Jūsu dzīvesvieta ir papildus nosiltināta?", + "u": "Kurš no apgalvojumiem atbilst Jūsu dzīves situācijai?", + "v": "Kurš no šiem apgalvojumiem ir patiess par Jūsu mājdzīvniekiem?", + "w": "Kurš no apgalvojumiem par pārvietošanos brīvdienās un atvaļinājumos Jums ir patiess?", + "y": "Kurš no šiem apgalvojumiem par apģērbu un apavu iegādi attiecas uz Jums?", + "z": "Kurš no apgalvojumiem par Jums ir patiess?", + } export_path = EXPORT_DIR / "individual" if not export_path.exists(): export_path.mkdir() + for column, question in QUESTIONS.items(): + checkbox.draw(data, question=question, filename=export_path / f"{column}.png") + + +def create_combinations() -> dict[str, Combination]: + QUESTIONS = { + "Es plānoju samazināt pārtikas atkritumus mājsaimniecībā", + "Kāda ir Jūsu uztura izvēle?", + "Kurš no sekojošiem apgalvojumiem Jums ir tuvāks?", + "Kādā mājokļa tipā Jūs dzīvojat?", + "Vai Jūs atteiktos no liekas mājokļa platības?", + "Vai Jūs būtu ar mieru dzīvot koplietojamā mājoklī?", + "Vai Jūsu dzīvesvieta ir papildus nosiltināta?", + } + + DEMOGRAPHIC = { + "Kāds ir Jūsu dzimums?", + "Kāds ir Jūsu vecums?", + "Kāds ir augstākais Jūsu iegūtais izglītības līmenis?", + # "Kurš no šiem variantiem atspoguļo Jūsu mājsaimniecības ikmēneša neto ienākumus?", + "Kāds ir Jūsu pašreizējais nodarbinātības statuss?", + "Kāda ir Jūsu dzīvesvieta?", + } + return { + f"{i + 1}": Combination(str(pair[0]), str(pair[1])) + for i, pair in enumerate(itertools.product(QUESTIONS, DEMOGRAPHIC)) + } + + +def correlation_charts(data: pd.DataFrame) -> None: + export_path = EXPORT_DIR / "correlation" + + if not export_path.exists(): + export_path.mkdir() + + for filename, comb in create_combinations().items(): + correlation.draw(data, comb, filename=export_path / f"{filename}.png") + def main() -> None: data = read_data(FILE_PATH) individual_charts(data) + correlation_charts(data) if __name__ == "__main__": diff --git a/src/question/correlation.py b/src/question/correlation.py new file mode 100644 index 0000000..d76472d --- /dev/null +++ b/src/question/correlation.py @@ -0,0 +1,33 @@ +from dataclasses import dataclass +from pathlib import Path +from typing import Optional + +import matplotlib.pyplot as plt +import pandas as pd + + +@dataclass +class Combination: + q1: str + q2: str + + +def draw( + df: pd.DataFrame, + comb: Combination, + /, + show: bool = False, + filename: Optional[Path] = None, +) -> None: + chart = pd.crosstab(df[comb.q1], df[comb.q2]) + chart.plot(kind="bar") + plt.figure(figsize=(16, 9)) + plt.title(comb.q1) + plt.xlabel("") + plt.ylabel("") + + if filename: + plt.savefig(filename) + + if show: + plt.show()