From 1a10f707da49fd45ddceee634f727fe989104b4b Mon Sep 17 00:00:00 2001
From: "Shekwoyeyilo2.gado@live.uwe.ac.uk" <sarah.y.gado@gmail.com>
Date: Thu, 1 May 2025 22:48:36 +0100
Subject: [PATCH] [add] final changes made

---
 .../__pycache__/overview.cpython-312.pyc      | Bin 7401 -> 7962 bytes
 ...est_functions.cpython-312-pytest-7.4.4.pyc | Bin 0 -> 7958 bytes
 dashboard/overview.py                         |  16 +++++
 dashboard/svc_model.pkl                       | Bin 31292 -> 31309 bytes
 dashboard/test_functions.py                   |  35 ++++++++++
 models.ipynb                                  |  63 +++++++++---------
 requirements.txt                              |   2 +
 7 files changed, 85 insertions(+), 31 deletions(-)
 create mode 100644 dashboard/__pycache__/test_functions.cpython-312-pytest-7.4.4.pyc
 create mode 100644 dashboard/test_functions.py

diff --git a/dashboard/__pycache__/overview.cpython-312.pyc b/dashboard/__pycache__/overview.cpython-312.pyc
index 8f2f26704cc6e3bfa9550e84daca8bd42c99817e..321b88fb7c5348f1282cb7d830f742620755193b 100644
GIT binary patch
delta 1314
zcmaE9Im?dkG%qg~0|NuY!aKqlo{}5+IvJUK*eB0qe9D+Rxt=M8r-TP23&L6alMPvf
zc{$f`t!4!A85ptzK_ZOYljGS%8HGS>QJxyc6y6lRHT<htAZi#H@^U8EGs#c>!=xoI
z0uf_ifSJI^Py!bt#(Zvp8paesi20KZnbmcLkW3PXnT{|MCR@u?!;~dC`6G)M(`u&4
z3z>u&r6zA=7G`9c?8qcKxr<4JQ53{tlmU5yS!|6sg6Ax;MjU1gBSVQi%#zhmMlExR
zB9zHc!wged%TmLfA}Pthz);It!!p^CRYt~zVFF{UB?ChY69YpnTP=GDG!z*avQ$9U
za!S>(&1OiEp34lfe6kk1h`LOQY&sLnNU%PRTFx2{QwBx`blt{sHEda$Foz&$m@{WH
zq{z>OJCBi}hAl;5av`g#pd!qCMuxn$8nzTAkmzJPc1{jPhP><=wiFeRfS@XpvVa=4
z6g9A@I+Cbq4O@x^SX2{9RH}w8MQd_Bn<}IB<o|3^IyIbN*K5OESi@e!TEn)Q8N#n+
zLh=_ZivF`{GwOgs$Xo|zFxU)zh#m%{Gz62!VUE<~#q7R}x|2V$|EPD<WW2?inU|7U
zQN>zXlBR1>CFhb~o|luKn4%Dznv<GblA5C6mYP^nT9jI>;2a!QC0Yy>j!%OM>m?VL
zRdJN0R+Q)`7nf<W++xj1OiInU#gdX(l6Z?VEi)%IJ})sh^%hHRW^QVgB-{eGQiYrx
z1((E<#NyNvu;Bt}r8znAAbrKDB_MM*zvMW^$0#v*gSf2%TS<O=a&g%$w$!}j{FKyN
z{3%eE#wV4Ql;r14ej~2IC^%VE!dZ;#79Z4*_~eZI%;eNt%*n-NlQSh;SV8$*Ve&?a
zRBj6f1_ltXSd)3OqGWFU6%NHOYz+KT*ZCAK@+mARy}+k%nNRmRpUFi&lMUgQ`D{Cw
z?{IKk=a9O{A$3E@=!T%k4Kdvtg3{kOSvY0C@Gx+4_w#h}Oo+R}p>l_V3&frheuYE!
z37=?xUT59{(~i8$e45w!3@-8+Y!JW9XNh8*?hPT3c^WqarN4sB<6~fD-@HcBh{@!H
ztuv<|BkLIfWj|ilv%;!=Qq1QVS^c;;&+)SQiF2NlV)avI*A%$LSzJ<-nwXoDSyCiD
zSxCml5|ks0R2di;inJIQ7;f=EBP>2SKc~0|<olHjpFydo$ee+J;TMNZZhlH>PO4pz
T<K%XkNX{50M)4vC1_lNIF2F78

delta 829
zcmbPb_tKK@G%qg~0|NuYqkQ2EOYx0-os3K&Y?Eg)K4sLOY{()%c^;E3Q=T4}S;4Hu
z$p=yk!jm1DL?_#@i0E>zW(4sW7#JB!1R*R2h7!0sm~1U$4P%z@WJ6|QR<0E8)l8EY
zG6_#?6lSVngqg(117b0Xfz&YbuHi%QT>01V!OUS~D3OHOvKq>$Wh#+|G8t-^U@B{w
zYnW05K#FTwYM8TRCpWUH^Rw2nl|bFgz>p;evWs1?hIKYWiqPbXtm2FcAQ5%p6p?he
zIWbHO47KdF95w8wAU~q%W)`hsom|f<BQl#IMQkoJ%yLGC8rBr?$&T!*f)WU^ytW$F
z6iKkC6q0Cm4Qq-tSX2f{G@ynxMHVb7ha_rR!<r%w5*1fK5|yf9O;OC&U|=W`ovg?t
z&!{xHkwZ$Wh6C(kRe0F2)v(mCu4abtYZ(zCF|k1e6cddcQmhjgdu&)H-(giSRfbsr
zHboPn3wzvRF)5u<W%5goADbJvj`1;yPIi~HoxD_1osnnqSxIL>&Rcvbi6x1}sU`8r
z8TpyXsgu>DTv#|67#Jq!OQmw_GcYiKQf2WrrpfoEa@nqOC_drfn%pNX#>B$5`L47P
zlgV*LXHFkh)>9(NK7y>L#Z`Uen9s1X`tWg{5oGm|<~$?E>Z8uCDR7IkxTGjGF*hf(
zq)2SCvz(2k3<Cp0kt~Q%Vqjpn#gmqrSW;S)8lRk>Q(OeHcqPMUkXMWJ7#J9SaoFVM
ar<CTT+7($$-XRys>BGb*US!U|zyJWScAY~2

diff --git a/dashboard/__pycache__/test_functions.cpython-312-pytest-7.4.4.pyc b/dashboard/__pycache__/test_functions.cpython-312-pytest-7.4.4.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7b251e8ae104625150abdd6fdcdb1aab1d7d6bf2
GIT binary patch
literal 7958
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

literal 0
HcmV?d00001

diff --git a/dashboard/overview.py b/dashboard/overview.py
index 53bedb6..4348d75 100644
--- a/dashboard/overview.py
+++ b/dashboard/overview.py
@@ -18,9 +18,25 @@ def data_overview():
     if dataset_choice == "Selected Features":
         st.subheader("Selected Features Dataset")
         st.dataframe(df_filtered)
+
+        #option to download the datase
+        csv = df_filtered.to_csv(index=False).encode('utf-8')
+        st.download_button(
+            label="Download Selected Features CSV",
+            data=csv,
+            file_name='selected_features.csv',
+            mime='text/csv')
     else:
         st.subheader("Full Dataset")
         st.dataframe(df_full)
+    
+        csv = df_full.to_csv(index=False).encode('utf-8')
+        st.download_button(
+            label="Download Full Dataset CSV",
+            data=csv,
+            file_name='full_dataset.csv',
+            mime='text/csv')
+
 
     st.subheader("Diagnosis Distribution")
     fig = plot_distribution(df_full)
diff --git a/dashboard/svc_model.pkl b/dashboard/svc_model.pkl
index 1211b96082066ce1860ec90dee3b7c028dedb81c..993875ad9624a1a5d5d9defc956661a4f656d2ae 100644
GIT binary patch
delta 62
zcmdn<h4JhcMwSMasZJAFo-%f9eC3lh`A;?n$BH-pF8{Co-apwcTOK69X(uz?I&snI
S{ZlrlX7Au*ES)S@B?kbfVH}|V

delta 53
zcmX^6g>lapMwSMasfH6-o-%fBeC3nH!O%J-L%Y+NVX|AcJd~4>vAHaJ2Ond}Wc?~R
E06_T^FaQ7m

diff --git a/dashboard/test_functions.py b/dashboard/test_functions.py
new file mode 100644
index 0000000..3bf110f
--- /dev/null
+++ b/dashboard/test_functions.py
@@ -0,0 +1,35 @@
+import pytest
+import pandas as pd
+from visuals import load_full_data, create_grouped_features, plot_distribution, plot_correlation_with_diagnosis
+
+# Test Data Loading
+def test_load_full_data():
+    df = load_full_data()
+    assert isinstance(df, pd.DataFrame)
+    assert not df.empty
+    assert "Diagnosis" in df.columns
+
+# Test Feature Grouping 
+def test_create_grouped_features():
+    df = load_full_data()
+    grouped = create_grouped_features(df)
+    assert isinstance(grouped, dict)
+    assert "Cognitive" in grouped 
+    assert isinstance(grouped["Cognitive"], pd.DataFrame)
+
+# Test Distribution Plotting 
+def test_plot_distribution_returns_figure():
+    df = load_full_data()
+    fig = plot_distribution(df)
+    assert fig is not None
+    assert hasattr(fig, "savefig")
+
+# Test Correlation Plotting
+def test_plot_correlation_with_diagnosis():
+    df = load_full_data()
+    groups = create_grouped_features(df)
+    y = df["Diagnosis"]
+    group_df = groups["Clinical"]
+    fig = plot_correlation_with_diagnosis(group_df, y, "Clinical")
+    assert fig is not None
+    assert hasattr(fig, "savefig")
diff --git a/models.ipynb b/models.ipynb
index a8ee4d9..0b7a5e1 100644
--- a/models.ipynb
+++ b/models.ipynb
@@ -2,7 +2,7 @@
  "cells": [
   {
    "cell_type": "code",
-   "execution_count": 161,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -20,12 +20,13 @@
     "from sklearn.model_selection import cross_val_score, KFold\n",
     "from sklearn.svm import SVC\n",
     "from scipy.stats import randint\n",
-    "from sklearn.metrics import classification_report, confusion_matrix, accuracy_score"
+    "from sklearn.metrics import classification_report, confusion_matrix, accuracy_score\n",
+    "import pickle"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 23,
    "metadata": {},
    "outputs": [
     {
@@ -156,7 +157,7 @@
        "9  ['BehavioralProblems', 'DifficultyCompletingTa...  "
       ]
      },
-     "execution_count": 162,
+     "execution_count": 23,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -169,7 +170,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 163,
+   "execution_count": 24,
    "metadata": {},
    "outputs": [
     {
@@ -183,7 +184,7 @@
        " 'MMSE']"
       ]
      },
-     "execution_count": 163,
+     "execution_count": 24,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -197,7 +198,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 164,
+   "execution_count": 25,
    "metadata": {},
    "outputs": [
     {
@@ -583,7 +584,7 @@
        "[2149 rows x 35 columns]"
       ]
      },
-     "execution_count": 164,
+     "execution_count": 25,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -595,7 +596,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 165,
+   "execution_count": 26,
    "metadata": {},
    "outputs": [
     {
@@ -774,7 +775,7 @@
        "[2149 rows x 7 columns]"
       ]
      },
-     "execution_count": 165,
+     "execution_count": 26,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -787,7 +788,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 166,
+   "execution_count": 27,
    "metadata": {},
    "outputs": [
     {
@@ -835,7 +836,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 167,
+   "execution_count": 28,
    "metadata": {},
    "outputs": [
     {
@@ -865,7 +866,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 168,
+   "execution_count": 29,
    "metadata": {},
    "outputs": [
     {
@@ -902,7 +903,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 169,
+   "execution_count": 30,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -926,7 +927,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 170,
+   "execution_count": 31,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -970,7 +971,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 171,
+   "execution_count": 32,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -999,7 +1000,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 172,
+   "execution_count": 33,
    "metadata": {},
    "outputs": [
     {
@@ -1143,7 +1144,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 173,
+   "execution_count": 34,
    "metadata": {},
    "outputs": [
     {
@@ -1202,7 +1203,7 @@
    ],
    "source": [
     "\n",
-    "modelsvc = SVC(kernel='rbf', gamma='auto', C=10)\n",
+    "modelsvc = SVC(kernel='rbf', gamma='auto', C=10, probability=True)\n",
     "modelsvc.fit(X_train_scaled, y_train)\n",
     "y_predsvc = modelsvc.predict(X_test_scaled)\n",
     "accuracysvc = accuracy_score(y_test, y_predsvc)\n",
@@ -1281,7 +1282,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 174,
+   "execution_count": 35,
    "metadata": {},
    "outputs": [
     {
@@ -1419,7 +1420,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 175,
+   "execution_count": 36,
    "metadata": {},
    "outputs": [
     {
@@ -1432,7 +1433,7 @@
        " 'F1-Score': [0.9531150398295376, 0.9273908901898491, 0.9461287249795657]}"
       ]
      },
-     "execution_count": 175,
+     "execution_count": 36,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1443,7 +1444,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 176,
+   "execution_count": 37,
    "metadata": {},
    "outputs": [
     {
@@ -1517,7 +1518,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 177,
+   "execution_count": 38,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1533,17 +1534,17 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 178,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
-    "# import pickle\n",
+    "\n",
     "# # Save models\n",
     "# with open(\"rf_model.pkl\", \"wb\") as f:\n",
     "#     pickle.dump(modelr, f)\n",
     "\n",
-    "# with open(\"svc_model.pkl\", \"wb\") as f:\n",
-    "#     pickle.dump(modelsvc, f)\n",
+    "#with open(\"svc_model.pkl\", \"wb\") as f:\n",
+    "    #pickle.dump(modelsvc, f)\n",
     "\n",
     "# with open(\"dt_model.pkl\", \"wb\") as f:\n",
     "#     pickle.dump(modeld, f)\n"
@@ -1551,7 +1552,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 179,
+   "execution_count": 40,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1562,7 +1563,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 180,
+   "execution_count": 41,
    "metadata": {},
    "outputs": [
     {
@@ -1575,7 +1576,7 @@
        " 'F1-Score': [0.9531150398295376, 0.9273908901898491, 0.9461287249795657]}"
       ]
      },
-     "execution_count": 180,
+     "execution_count": 41,
      "metadata": {},
      "output_type": "execute_result"
     }
diff --git a/requirements.txt b/requirements.txt
index 74d8ac9..2def18e 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -7,3 +7,5 @@ Pillow
 scikit-learn
 scipy
 deap
+pytest
+pickle
-- 
GitLab