-
Syed Haque authoredSyed Haque authored
main_diabetics.py 15.77 KiB
import sys
from PyQt6 import QtWidgets,QtGui
from pyqtgraph import PlotWidget, plot
import pyqtgraph as pg
from PyQt6.QtWidgets import QWidget,QHBoxLayout, QApplication,QSlider, QMainWindow,QLabel, QPushButton,QHBoxLayout, QVBoxLayout, QGridLayout, QCheckBox
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QAction, QIcon,QPalette, QColor
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
matplotlib.use('Qt5Agg')
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn.metrics import accuracy_score
from PyQt6 import QtGui
diabetes = pd.read_csv('diabetes_clean_03042021.csv')
# highest correlation ---- x=age y=blood pressure
class MplCanvas(FigureCanvas):
def __init__(self, parent=None, width=5, height=2, dpi=100):
self.figure = Figure(figsize=(width, height), dpi=dpi)
self.axes = self.figure.add_subplot(111)
super(MplCanvas, self).__init__(self.figure)
class secondWindow(QMainWindow):
def __init__(self):
super().__init__()
# use global data
global diabetes
widget_histogram = QWidget()
# Vertical Layout
histogram_layout = QVBoxLayout()
# Create a new Canvas
self.histogram_screen = MplCanvas(self, width=5, height=2, dpi=100)
diabetes.hist(ax=self.histogram_screen.axes)
histogram_layout.addWidget(self.histogram_screen)
self.setCentralWidget(widget_histogram)
widget_histogram.setLayout(histogram_layout)
self.setMinimumSize(1500, 1000)
class thirdWindow(QMainWindow):
def __init__(self):
super().__init__()
global diabetes
self.graphWidget = pg.PlotWidget()
self.setCentralWidget(self.graphWidget)
self.x = diabetes["BMI"]
self.y = diabetes["Outcome"]
self.graphWidget.setBackground('w')
self.graphWidget.setLabel("left", "Diabetic Or Not Diabetic")
self.graphWidget.setLabel("bottom", "BMI")
pen = pg.mkPen(color=(255, 0, 0))
self.data_line = self.graphWidget.plot(self.x, self.y, pen=pen)
self.setMinimumSize(800, 400)
class MainWindow(QMainWindow):
def design(self):
layout3 = QHBoxLayout()
MainLayout = QHBoxLayout()
leftVerticalLayout = QVBoxLayout()
RightVerticalLayout = QVBoxLayout()
# setting window icon
self.setWindowIcon(QtGui.QIcon('health.png'))
#setting screen min size
self.setMinimumSize(1200, 800)
mainLabel = QLabel(" Women Diabetics Prediction System")
leftVerticalLayout.addWidget(mainLabel)
# checkbox button pregnancies
pregnanciesLabel = QLabel("Pregnancies", alignment=Qt.AlignmentFlag.AlignCenter)
pregnant_instruction = QLabel("Please click the box if Pregnant.", alignment=Qt.AlignmentFlag.AlignCenter)
leftVerticalLayout.addWidget(pregnanciesLabel)
leftVerticalLayout.addWidget(pregnant_instruction)
self.pregnancies_checkbox = QCheckBox(text="Not Pregnant")
leftVerticalLayout.addWidget(self.pregnancies_checkbox)
self.pregnancies_checkbox.stateChanged.connect(self.Pregnancies_onStateChanged)
# Silder button glucose
self.Glucose = QSlider(Qt.Orientation.Horizontal)
self.Glucose.setMinimum(30)
self.Glucose.setMaximum(200)
self.Glucose.valueChanged.connect(self.updateSlider_Glucose)
self.Glucose.setGeometry(5, 3, 20, 20)
self.selectedValue_glucose = QLabel(self)
self.selectedValue_glucose.setText(str(30))
glocoseLabel = QLabel("Glucose [30 - 200]", alignment=Qt.AlignmentFlag.AlignCenter)
leftVerticalLayout.addWidget(glocoseLabel)
leftVerticalLayout.addWidget(self.Glucose)
leftVerticalLayout.addWidget(self.selectedValue_glucose)
# Silder button blood pressure
self.BloodPressure = QSlider(Qt.Orientation.Horizontal)
self.BloodPressure.setMinimum(30)
self.BloodPressure.setMaximum(120)
self.BloodPressure.valueChanged.connect(self.updateSlider_BloodPressure)
self.BloodPressure.setGeometry(5, 3, 20, 20)
self.selectedValue_blood = QLabel(self)
self.selectedValue_blood.setText(str(30))
bloodpressureLabel = QLabel("Blood Pressure [30 - 120]", alignment=Qt.AlignmentFlag.AlignCenter)
leftVerticalLayout.addWidget(bloodpressureLabel)
leftVerticalLayout.addWidget(self.BloodPressure)
leftVerticalLayout.addWidget(self.selectedValue_blood)
# Silder button skin thickness
self.SkinThickness = QSlider(Qt.Orientation.Horizontal)
self.SkinThickness.setMinimum(0)
self.SkinThickness.setMaximum(100)
self.SkinThickness.valueChanged.connect(self.updateSlider_skinThickness)
self.SkinThickness.setGeometry(5, 3, 20, 20)
self.selectedValue_skin = QLabel(self)
self.selectedValue_skin.setText(str(0))
skinThicknessLabel = QLabel("Skin Thickness[0 - 100]", alignment=Qt.AlignmentFlag.AlignCenter)
leftVerticalLayout.addWidget(skinThicknessLabel)
leftVerticalLayout.addWidget(self.SkinThickness)
leftVerticalLayout.addWidget(self.selectedValue_skin)
# Silder button Insulin
self.Insulin = QSlider(Qt.Orientation.Horizontal)
self.Insulin.setMinimum(5)
self.Insulin.setMaximum(700)
self.Insulin.valueChanged.connect(self.updateSlider_insulin)
self.Insulin.setGeometry(5, 3, 20, 20)
self.selectedValue_insulin = QLabel(self)
self.selectedValue_insulin.setText(str(5))
insulinLabel = QLabel("Insulin [5 - 700]", alignment=Qt.AlignmentFlag.AlignCenter)
leftVerticalLayout.addWidget(insulinLabel)
leftVerticalLayout.addWidget(self.Insulin)
leftVerticalLayout.addWidget(self.selectedValue_insulin)
# Silder button BMI
self.BMI = QSlider(Qt.Orientation.Horizontal)
self.BMI.setMinimum(10)
self.BMI.setMaximum(80)
self.BMI.valueChanged.connect(self.updateSlider_BMI)
self.BMI.setGeometry(5, 3, 20, 20)
self.selectedValue_BMI = QLabel(self)
self.selectedValue_BMI.setText(str(10))
bmiLabel = QLabel("BMI [10 - 80]", alignment=Qt.AlignmentFlag.AlignCenter)
leftVerticalLayout.addWidget(bmiLabel)
leftVerticalLayout.addWidget(self.BMI)
leftVerticalLayout.addWidget(self.selectedValue_BMI)
# Silder button DiabetesPredegreeFunction
self.DiabetesPredegreeFunction = QSlider(Qt.Orientation.Horizontal)
self.DiabetesPredegreeFunction.setMinimum(0)
self.DiabetesPredegreeFunction.setMaximum(4)
self.DiabetesPredegreeFunction.setTickInterval(4)
self.DiabetesPredegreeFunction.valueChanged.connect(self.updateSlider_dibeticsPredegree)
self.DiabetesPredegreeFunction.setGeometry(5, 3, 20, 20)
self.selectedValue_predegree = QLabel(self)
self.selectedValue_predegree.setText(str(0))
label7 = QLabel("Diabetes Predegree Func [0 - 4]", alignment=Qt.AlignmentFlag.AlignCenter)
leftVerticalLayout.addWidget(label7)
leftVerticalLayout.addWidget(self.DiabetesPredegreeFunction)
leftVerticalLayout.addWidget(self.selectedValue_predegree)
# Silder button Age
self.age = QSlider(Qt.Orientation.Horizontal)
self.age.setMinimum(18)
self.age.setMaximum(150)
self.age.valueChanged.connect(self.updateSlider_Age)
self.age.setGeometry(5, 3, 20, 20)
self.selectedValue_age = QLabel(self)
self.selectedValue_age.setText(str(18))
label8 = QLabel("Age [18 - 150]", alignment=Qt.AlignmentFlag.AlignCenter)
leftVerticalLayout.addWidget(label8)
leftVerticalLayout.addWidget(self.age)
leftVerticalLayout.addWidget(self.selectedValue_age)
# Push button Predict
self.predict = QPushButton("Predict")
leftVerticalLayout.addWidget(self.predict)
self.predict.clicked.connect(self.predictiveSystem)
self.predictedValue = QLabel(" Prediction: None", self)
leftVerticalLayout.addWidget(self.predictedValue)
####----------------Main Window Graph ------------
self.setWindowTitle('Women Diabetics Prediction')
x = diabetes["Age"]
y = diabetes["Glucose"]
fig = Figure()
ax =fig.add_subplot(111)
ax.set_title('Glucose Levels Across Age:Predicting Diabetes Risk.')
x_label= ax.set_xlabel('Age')
y_label = ax.set_ylabel('Glucose')
#ax.bar(x,y)
ax.bar(x,y)
graph =FigureCanvas(fig)
###--------Connecting (all the buttons to left vertical layout) & (graph to the right vertical layout)
RightVerticalLayout.addWidget(graph)
MainLayout.addLayout(leftVerticalLayout)
MainLayout.addLayout(RightVerticalLayout)
mainWidget = QWidget()
mainWidget.setLayout(MainLayout)
self.setCentralWidget(mainWidget)
# menu
# action 1 from menu
self.window2 = None
histogram_action = QAction(QIcon("chart-medium.png"), "Histogram", self)
histogram_action.setStatusTip("View Histogram.")
histogram_action.triggered.connect(self.show_hist_window)
# action 2 from menu
self.window3 = None
plot_action = QAction(QIcon("plot.png"), "Plot Graph", self)
plot_action.setStatusTip("Real Time Graph")
plot_action.triggered.connect(self.show_realTime_window)
menu = self.menuBar()
file_menu = menu.addMenu("&Menu")
file_menu.addAction(histogram_action)
file_menu.addAction(plot_action)
def Pregnancies_onStateChanged(self):
if self.pregnancies_checkbox.isChecked():
self.pregnancies_checkbox.setText("Pregnant")
else:
self.pregnancies_checkbox.setText("Not Pregnant")
def updateSlider_pregnancies(self):
val = self.pregnancies.value()
self.selectedValue_preg.setText(str(val))
def updateSlider_Glucose(self):
val = self.Glucose.value()
self.selectedValue_glucose.setText(str(val))
def updateSlider_BloodPressure(self):
val = self.BloodPressure.value()
self.selectedValue_blood.setText(str(val))
def updateSlider_skinThickness(self):
val = self.SkinThickness.value()
self.selectedValue_skin.setText(str(val))
def updateSlider_insulin(self):
val = self.Insulin.value()
self.selectedValue_insulin.setText(str(val))
def updateSlider_BMI(self):
val = self.BMI.value()
self.selectedValue_BMI.setText(str(val))
def updateSlider_dibeticsPredegree(self):
val = self.DiabetesPredegreeFunction.value()
self.selectedValue_predegree.setText(str(val))
def updateSlider_Age(self):
val = self.age.value()
self.selectedValue_age.setText(str(val))
def show_hist_window(self):
if self.window2 is None:
self.window2 = secondWindow()
self.window2.show()
def show_realTime_window(self):
if self.window3 is None:
self.window3 = thirdWindow()
self.window3.show()
def generateData(self):
global diabetes
self.diabetes = pd.read_csv('diabetes_clean_03042021.csv')
print("self.diabetes.head(8):")
print(self.diabetes.head(10))
print("self.diabetes.tail(5): ")
print(self.diabetes.tail(5))
print("self.diabetes.info():")
print(self.diabetes.info())
# number of rows and columns
print("Rows: ", self.diabetes.shape[0])
print("Columns: ", self.diabetes.shape[1])
print("self.diabetes.describe(): ")
print(self.diabetes.describe())
print("Total Diabetic(1) and Non-diabetic(0) patient:", self.diabetes['Outcome'].value_counts())
print("[Mean] grouped by diabetic(1) and Non-diabetic(0) patient: ")
print(self.diabetes.groupby('Outcome').mean())
# ----------- Machine learning ------
print("-----Training data-----")
x = self.diabetes.drop(columns='Outcome', axis=1) # data
y = self.diabetes['Outcome'] # model
# Data Standardization
self.scaler = StandardScaler()
self.scaler.fit(x)
standardized_data = self.scaler.transform(x)
# print(standardized_data)
x = standardized_data # data
y = self.diabetes['Outcome'] # model
# Train Test Split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.20, random_state=42)
# test_size = 0.20 means 20% test data and 80% train data
# print(x.shape, x_train.shape, x_test.shape)
# Training The Model with SVM Algorithm
self. svm_classifier = svm.SVC(kernel='linear')
# training the support vector machine classifier
self.svm_classifier.fit(x_train, y_train)
# Accuracy Check
# Train Data
x_train_prediction = self.svm_classifier.predict(x_train)
training_data_accuracy = accuracy_score(x_train_prediction, y_train)
print("Accuracy Score of the training data: ", training_data_accuracy)
# Test data
x_test_prediction = self.svm_classifier.predict(x_test)
test_data_accuracy = accuracy_score(x_test_prediction, y_test)
print("Accuracy Score of the testing data: ", test_data_accuracy)
# correlation ---- highest x=age y=blood pressure
corr_matrix = self.diabetes.corr()
print("self.diabetes.corr(): ", corr_matrix)
if (x_test_prediction[0] == 0):
result = print("The person is not diabetic. ")
else:
result = print("The person is diabetic. ")
# calculating the values for the predictive System
def predictiveSystem(self):
global result
from random import randint
count = randint(0, 767)
# converting checkbox value into 0 or 1
if self.pregnancies_checkbox.isChecked() == True:
pregnancies_checkbox = 1
else:
pregnancies_checkbox = 0
Glucose = self.Glucose.value()
BloodPressure =self.BloodPressure.value()
SkinThickness = self.SkinThickness.value()
Insulin = self.Insulin.value()
bmi = self.BMI.value()
DiabetesPedigreeFunction = self.DiabetesPredegreeFunction.value()
Age = self.age.value()
# inputData = [value,1, 110, 92, 0, 0, 37.6,0.191, 30]
sampleData = [count, pregnancies_checkbox, Glucose, BloodPressure, SkinThickness, Insulin, bmi, DiabetesPedigreeFunction,
Age]
# change the input data to numpy array
sampleData_numpy = np.asarray(sampleData)
# reshaping array as we are predicting for one instance
reshaping = sampleData_numpy.reshape(1, -1)
# standardize the input data
standardize_sampleData = self.scaler.transform(reshaping)
# print(std_data)
prediction = self.svm_classifier.predict(standardize_sampleData)
print(prediction)
if (prediction[0] == 0):
self.predictedValue.setText("Prediction: The person is not diabetic. ")
else:
self.predictedValue.setText("Prediction: The person is diabetic. ")
if __name__ == '__main__':
app = QApplication(sys.argv)
with open("style.css", "r") as file:
app.setStyleSheet(file.read())
window = MainWindow()
#window.setFixedSize(1200,800)
window.design()
window.generateData()
window.show()
sys.exit(app.exec())