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