ESMATUGBA commited on
Commit
9a2f96a
·
verified ·
1 Parent(s): de0c75e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +72 -63
app.py CHANGED
@@ -1,90 +1,99 @@
1
  import streamlit as st
2
  import os
3
- import subprocess
4
-
5
- # --- 1. JAVA VE ÇEVRESEL AYARLAR (JAVA & ENVIRONMENT SETTINGS) ---
6
- try:
7
- # Java yolunu sistemden otomatik bulur (Finds Java path automatically)
8
- java_path = subprocess.check_output(['which', 'java']).decode('utf-8').strip()
9
- real_java_path = os.path.realpath(java_path)
10
- os.environ["JAVA_HOME"] = real_java_path.replace("/bin/java", "")
11
- except:
12
- # Hata durumunda varsayılan yol (Default path if fails)
13
- os.environ["JAVA_HOME"] = "/usr/lib/jvm/java-17-openjdk-amd64"
14
-
15
  from pyspark.sql import SparkSession
16
  from pyspark.ml.classification import LogisticRegressionModel
17
  from pyspark.ml.feature import VectorAssembler
18
 
19
- # --- 2. SAYFA AYARLARI (PAGE SETTINGS) ---
20
- st.set_page_config(page_title="Heart Disease Predictor", page_icon="🫀")
 
 
 
 
 
 
 
 
 
21
  st.title("🫀 Heart Disease Risk Prediction")
22
  st.subheader("Kalp Hastalığı Risk Tahmini")
 
23
 
24
- # --- 3. SPARK OTURUMU (SPARK SESSION) ---
25
  @st.cache_resource
26
- def get_spark():
27
- return SparkSession.builder \
28
- .appName("HeartDiseasePredictor") \
 
29
  .master("local[*]") \
 
30
  .getOrCreate()
31
-
32
- spark = get_spark()
33
-
34
- # --- 4. MODELİ YÜKLEME (LOAD MODEL) ---
35
- @st.cache_resource
36
- def load_heart_model():
37
- # heart_model klasöründen verileri çeker
38
- return LogisticRegressionModel.load("heart_model")
39
 
40
  try:
41
- model = load_heart_model()
42
- st.success("✅ Model loaded successfully! / Model başarıyla yüklendi!")
43
  except Exception as e:
44
- st.error(f"❌ Error loading model: {e}")
 
45
  st.stop()
46
 
47
- # --- 5. GİRİŞ ALANLARI (INPUT FIELDS) ---
48
- st.sidebar.header("Patient Data / Hasta Verileri")
49
 
50
- def user_input_features():
51
- age = st.sidebar.number_input("Age / Yaş", 1, 120, 50)
52
- sex = st.sidebar.selectbox("Sex / Cinsiyet (1: M, 0: F)", [1, 0])
53
- cp = st.sidebar.selectbox("Chest Pain / Göğüs Ağrısı (0-3)", [0, 1, 2, 3])
54
- trestbps = st.sidebar.number_input("Resting Blood Pressure / Kan Basıncı", 50, 250, 120)
55
- chol = st.sidebar.number_input("Cholesterol / Kolesterol", 100, 600, 200)
56
- fbs = st.sidebar.selectbox("Fasting Blood Sugar > 120 (1: Y, 0: N)", [0, 1])
57
- restecg = st.sidebar.selectbox("Resting ECG / Dinlenme EKG (0-2)", [0, 1, 2])
58
- thalach = st.sidebar.number_input("Max Heart Rate / Maks. Kalp Hızı", 50, 250, 150)
59
- exang = st.sidebar.selectbox("Exercise Induced Angina (1: Y, 0: N)", [0, 1])
60
- oldpeak = st.sidebar.number_input("Oldpeak", 0.0, 10.0, 1.0)
61
- slope = st.sidebar.selectbox("Slope (0-2)", [0, 1, 2])
62
- ca = st.sidebar.selectbox("Major Vessels / Damar Sayısı (0-4)", [0, 1, 2, 3, 4])
63
- thal = st.sidebar.selectbox("Thal (0-3)", [0, 1, 2, 3])
64
 
65
- data = {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  'age': age, 'sex': sex, 'cp': cp, 'trestbps': trestbps, 'chol': chol,
67
  'fbs': fbs, 'restecg': restecg, 'thalach': thalach, 'exang': exang,
68
  'oldpeak': oldpeak, 'slope': slope, 'ca': ca, 'thal': thal
69
  }
70
- return spark.createDataFrame([data])
71
 
72
- input_df = user_input_features()
73
 
74
- # --- 6. TAHMİN (PREDICTION) ---
75
- if st.button("Predict / Tahmin Et"):
76
- feature_cols = ['age', 'sex', 'cp', 'trestbps', 'chol', 'fbs', 'restecg', 'thalach', 'exang', 'oldpeak', 'slope', 'ca', 'thal']
77
- assembler = VectorAssembler(inputCols=feature_cols, outputCol="features")
78
- final_data = assembler.transform(input_df)
79
-
80
- prediction = model.transform(final_data)
81
- result = prediction.select("prediction").collect()[0][0]
82
- probability = prediction.select("probability").collect()[0][0]
 
 
 
 
83
 
84
- if result == 1.0:
85
- st.error(f"⚠️ Risk: HIGH / YÜKSEK (Prob: %{round(probability[1]*100, 2)})")
86
- else:
87
- st.success(f"💚 Risk: LOW / DÜŞÜK (Prob: %{round(probability[0]*100, 2)})")
 
 
 
88
 
89
- st.divider()
90
- st.caption("Disclaimer: This is for educational purposes only. / Tıbbi tavsiye değildir.")
 
1
  import streamlit as st
2
  import os
 
 
 
 
 
 
 
 
 
 
 
 
3
  from pyspark.sql import SparkSession
4
  from pyspark.ml.classification import LogisticRegressionModel
5
  from pyspark.ml.feature import VectorAssembler
6
 
7
+ # --- 1. SAYFA AYARLARI (PAGE CONFIG) ---
8
+ st.set_page_config(page_title="Heart Disease Predictor", page_icon="🫀", layout="centered")
9
+
10
+ # CSS ile buton ve başlıkları güzelleştirelim
11
+ st.markdown("""
12
+ <style>
13
+ .main { opacity: 0.95; }
14
+ .stButton>button { width: 100%; border-radius: 20px; height: 3em; background-color: #ff4b4b; color: white; }
15
+ </style>
16
+ """, unsafe_allow_html=True)
17
+
18
  st.title("🫀 Heart Disease Risk Prediction")
19
  st.subheader("Kalp Hastalığı Risk Tahmini")
20
+ st.write("---")
21
 
22
+ # --- 2. SPARK VE MODEL YÜKLEME (SPARK & MODEL LOADING) ---
23
  @st.cache_resource
24
+ def initialize_app():
25
+ # Spark oturumunu başlat
26
+ spark = SparkSession.builder \
27
+ .appName("HeartDiseaseApp") \
28
  .master("local[*]") \
29
+ .config("spark.driver.bindAddress", "127.0.0.1") \
30
  .getOrCreate()
31
+
32
+ # Modeli yükle (heart_model klasöründen)
33
+ model = LogisticRegressionModel.load("heart_model")
34
+ return spark, model
 
 
 
 
35
 
36
  try:
37
+ spark, model = initialize_app()
38
+ st.success("✅ System Ready / Sistem Hazır")
39
  except Exception as e:
40
+ st.error(f"❌ Initialization Error / Başlatma Hatası: {e}")
41
+ st.info("Lütfen heart_model klasörünün doğruluğunu kontrol edin.")
42
  st.stop()
43
 
44
+ # --- 3. KULLANICI GİRİŞLERİ (USER INPUTS) ---
45
+ st.sidebar.header("📋 Patient Data / Hasta Verileri")
46
 
47
+ def get_inputs():
48
+ col1, col2 = st.columns(2)
 
 
 
 
 
 
 
 
 
 
 
 
49
 
50
+ with col1:
51
+ age = st.number_input("Age / Yaş", 1, 120, 50)
52
+ sex = st.selectbox("Sex / Cinsiyet", options=[1, 0], format_func=lambda x: "Male/Erkek (1)" if x == 1 else "Female/Kadın (0)")
53
+ cp = st.selectbox("Chest Pain / Göğüs Ağrısı (0-3)", [0, 1, 2, 3])
54
+ trestbps = st.number_input("Resting BP / Kan Basıncı", 50, 250, 120)
55
+ chol = st.number_input("Cholesterol / Kolesterol", 100, 600, 200)
56
+ fbs = st.selectbox("Fasting Sugar > 120 / Şeker", [0, 1], format_func=lambda x: "Yes/Evet (1)" if x == 1 else "No/Hayır (0)")
57
+
58
+ with col2:
59
+ restecg = st.selectbox("Resting ECG / EKG (0-2)", [0, 1, 2])
60
+ thalach = st.number_input("Max Heart Rate / Kalp Hızı", 50, 250, 150)
61
+ exang = st.selectbox("Exercise Angina / Anjin", [0, 1], format_func=lambda x: "Yes/Evet (1)" if x == 1 else "No/Hayır (0)")
62
+ oldpeak = st.number_input("Oldpeak", 0.0, 10.0, 1.0)
63
+ slope = st.selectbox("Slope (0-2)", [0, 1, 2])
64
+ ca = st.selectbox("Major Vessels / Damar Sayısı", [0, 1, 2, 3, 4])
65
+ thal = st.selectbox("Thal (0-3)", [0, 1, 2, 3])
66
+
67
+ input_data = {
68
  'age': age, 'sex': sex, 'cp': cp, 'trestbps': trestbps, 'chol': chol,
69
  'fbs': fbs, 'restecg': restecg, 'thalach': thalach, 'exang': exang,
70
  'oldpeak': oldpeak, 'slope': slope, 'ca': ca, 'thal': thal
71
  }
72
+ return spark.createDataFrame([input_data])
73
 
74
+ input_df = get_inputs()
75
 
76
+ # --- 4. TAHMİN (PREDICTION) ---
77
+ st.write("---")
78
+ if st.button("PREDICT / TAHMİN ET"):
79
+ with st.spinner('Analyzing... / Analiz ediliyor...'):
80
+ # Özellikleri vektöre dönüştür
81
+ feature_cols = ['age', 'sex', 'cp', 'trestbps', 'chol', 'fbs', 'restecg', 'thalach', 'exang', 'oldpeak', 'slope', 'ca', 'thal']
82
+ assembler = VectorAssembler(inputCols=feature_cols, outputCol="features")
83
+ final_data = assembler.transform(input_df)
84
+
85
+ # Tahmin yap
86
+ prediction_results = model.transform(final_data)
87
+ result = prediction_results.select("prediction").collect()[0][0]
88
+ probability = prediction_results.select("probability").collect()[0][0]
89
 
90
+ st.subheader("Results / Sonuçlar")
91
+ if result == 1.0:
92
+ st.error(f"⚠️ HIGH RISK / YÜKSEK RİSK")
93
+ st.write(f"Confidence / Güven Oranı: %{round(probability[1]*100, 2)}")
94
+ else:
95
+ st.success(f"💚 LOW RISK / DÜŞÜK RİSK")
96
+ st.write(f"Confidence / Güven Oranı: %{round(probability[0]*100, 2)}")
97
 
98
+ st.write("---")
99
+ st.caption("Disclaimer: Not for medical use. / Tıbbi amaçlı kullanılamaz.")