Sahil0605 commited on
Commit
45a0991
·
1 Parent(s): df4903f

first push

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +28 -34
src/streamlit_app.py CHANGED
@@ -6,52 +6,42 @@ from sklearn.preprocessing import LabelEncoder
6
  from sklearn.model_selection import train_test_split
7
  from sklearn.linear_model import LinearRegression, LogisticRegression
8
  from sklearn.neighbors import KNeighborsClassifier
9
- from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor
10
  from sklearn.metrics import accuracy_score, r2_score
11
 
12
- # Sidebar navigation
13
  st.sidebar.title("Navigation")
14
  page = st.sidebar.selectbox("Go to", ["Upload File", "Preprocess Data", "Train & Select Model", "Create App"])
15
 
16
- # Writable directories for Hugging Face / Streamlit Cloud
17
- BASE_DIR = "/tmp"
18
- UPLOAD_DIR = os.path.join(BASE_DIR, "uploads")
19
- PROCESSED_DIR = os.path.join(BASE_DIR, "processed")
20
- PKL_DIR = os.path.join(BASE_DIR, "pkl")
21
- ENCODER_DIR = os.path.join(BASE_DIR, "encoders")
22
 
23
- # Create all necessary writable directories
24
- for d in [UPLOAD_DIR, PROCESSED_DIR, PKL_DIR, ENCODER_DIR]:
25
- os.makedirs(d, exist_ok=True)
26
-
27
- # -------------------- UPLOAD FILE PAGE --------------------
28
  if page == "Upload File":
29
  st.title("Upload CSV or SQL File")
30
  uploaded_file = st.file_uploader("Upload a CSV or SQL file", type=["csv", "sql"])
31
 
32
  if uploaded_file is not None:
33
- save_path = os.path.join(UPLOAD_DIR, uploaded_file.name)
34
  with open(save_path, "wb") as f:
35
  f.write(uploaded_file.getbuffer())
36
  st.success(f"File saved to {save_path}")
37
 
38
  if uploaded_file.name.endswith(".csv"):
39
- uploaded_file.seek(0)
40
- df = pd.read_csv(uploaded_file)
41
  st.dataframe(df)
42
  elif uploaded_file.name.endswith(".sql"):
43
- uploaded_file.seek(0)
44
- sql_content = uploaded_file.read().decode("utf-8", errors="ignore")
45
  st.text_area("SQL Content", sql_content, height=300)
46
 
47
- # -------------------- PREPROCESS DATA PAGE --------------------
48
  elif page == "Preprocess Data":
49
  st.title("Preprocess Uploaded CSV")
50
- files = [f for f in os.listdir(UPLOAD_DIR) if f.endswith(".csv")]
51
 
52
  if files:
53
  selected_file = st.selectbox("Select a CSV file to preprocess", files)
54
- file_path = os.path.join(UPLOAD_DIR, selected_file)
55
 
56
  if "df" not in st.session_state or st.session_state.file_path != file_path:
57
  st.session_state.df = pd.read_csv(file_path)
@@ -70,6 +60,9 @@ elif page == "Preprocess Data":
70
  st.session_state.df = st.session_state.df.replace(missing_placeholders, pd.NA)
71
  st.session_state.df = st.session_state.df.dropna()
72
  st.success("All placeholder and missing values dropped!")
 
 
 
73
  st.dataframe(st.session_state.df)
74
 
75
  col_to_drop = st.multiselect("Select columns to drop", st.session_state.df.columns)
@@ -84,29 +77,29 @@ elif page == "Preprocess Data":
84
  st.session_state.df[col] = le.fit_transform(st.session_state.df[col].astype(str))
85
  label_encoders[col] = le
86
 
 
87
  for col, le in label_encoders.items():
88
- with open(os.path.join(ENCODER_DIR, f"{selected_file}_{col}_encoder.pkl"), "wb") as f:
89
  pickle.dump(le, f)
90
 
91
  st.success("All object columns label-encoded and encoders saved!")
92
  st.dataframe(st.session_state.df)
93
 
94
  if st.button("Save Preprocessed File"):
95
- processed_path = os.path.join(PROCESSED_DIR, selected_file)
96
  st.session_state.df.to_csv(processed_path, index=False)
97
  st.success(f"Preprocessed file saved to: {processed_path}")
98
  else:
99
  st.warning("No CSV files available. Please upload a CSV first.")
100
 
101
- # -------------------- TRAIN & SELECT MODEL PAGE --------------------
102
  elif page == "Train & Select Model":
103
  st.title("Train Models and Select the Best One")
104
 
105
- processed_files = [f for f in os.listdir(PROCESSED_DIR) if f.endswith(".csv")]
106
 
107
  if processed_files:
108
  selected_file = st.selectbox("Select a processed CSV", processed_files)
109
- file_path = os.path.join(PROCESSED_DIR, selected_file)
110
 
111
  df = pd.read_csv(file_path)
112
  st.dataframe(df.head())
@@ -144,7 +137,7 @@ elif page == "Train & Select Model":
144
  else:
145
  models = {
146
  "Linear Regression": LinearRegression(),
147
- "Decision Tree Regressor": DecisionTreeRegressor()
148
  }
149
  for name, model in models.items():
150
  model.fit(X_train, y_train)
@@ -159,21 +152,20 @@ elif page == "Train & Select Model":
159
  selected_model_name = st.selectbox("Select model to save", list(results.keys()))
160
  if st.button("Save Selected Model"):
161
  final_model = models[selected_model_name]
162
- pkl_path = os.path.join(PKL_DIR, f"{selected_model_name}.pkl")
163
  with open(pkl_path, "wb") as f:
164
  pickle.dump(final_model, f)
165
  st.success(f"Model saved as {pkl_path}")
166
  else:
167
  st.warning("No processed files found. Please preprocess a file first.")
168
 
169
- # -------------------- CREATE APP PAGE --------------------
170
  elif page == "Create App":
171
  st.title("Use Model for Prediction")
172
 
173
- processed_files = [f for f in os.listdir(PROCESSED_DIR) if f.endswith(".csv")]
174
  if processed_files:
175
  selected_csv = st.selectbox("Select a processed CSV file", processed_files)
176
- df = pd.read_csv(os.path.join(PROCESSED_DIR, selected_csv))
177
  target_col = st.selectbox("Select target column", df.columns)
178
 
179
  if target_col:
@@ -189,15 +181,17 @@ elif page == "Create App":
189
 
190
  model.fit(X, y)
191
 
 
192
  encoders = {}
193
  for col in X.columns:
194
- encoder_path = os.path.join(ENCODER_DIR, f"{selected_csv}_{col}_encoder.pkl")
195
  if os.path.exists(encoder_path):
196
  with open(encoder_path, "rb") as f:
197
  encoders[col] = pickle.load(f)
198
 
 
199
  target_encoder = None
200
- target_encoder_path = os.path.join(ENCODER_DIR, f"{selected_csv}_{target_col}_encoder.pkl")
201
  if os.path.exists(target_encoder_path):
202
  with open(target_encoder_path, "rb") as f:
203
  target_encoder = pickle.load(f)
@@ -226,4 +220,4 @@ elif page == "Create App":
226
  else:
227
  st.text(prediction[0])
228
  else:
229
- st.warning("No processed CSV files found. Please preprocess a file first.")
 
6
  from sklearn.model_selection import train_test_split
7
  from sklearn.linear_model import LinearRegression, LogisticRegression
8
  from sklearn.neighbors import KNeighborsClassifier
9
+ from sklearn.tree import DecisionTreeClassifier
10
  from sklearn.metrics import accuracy_score, r2_score
11
 
 
12
  st.sidebar.title("Navigation")
13
  page = st.sidebar.selectbox("Go to", ["Upload File", "Preprocess Data", "Train & Select Model", "Create App"])
14
 
15
+ os.makedirs("uploads", exist_ok=True)
16
+ os.makedirs("processed", exist_ok=True)
17
+ os.makedirs("pkl", exist_ok=True)
18
+ os.makedirs("encoders", exist_ok=True) # Folder to save encoders
 
 
19
 
 
 
 
 
 
20
  if page == "Upload File":
21
  st.title("Upload CSV or SQL File")
22
  uploaded_file = st.file_uploader("Upload a CSV or SQL file", type=["csv", "sql"])
23
 
24
  if uploaded_file is not None:
25
+ save_path = os.path.join("uploads", uploaded_file.name)
26
  with open(save_path, "wb") as f:
27
  f.write(uploaded_file.getbuffer())
28
  st.success(f"File saved to {save_path}")
29
 
30
  if uploaded_file.name.endswith(".csv"):
31
+ df = pd.read_csv(save_path)
 
32
  st.dataframe(df)
33
  elif uploaded_file.name.endswith(".sql"):
34
+ with open(save_path, "r", encoding="utf-8") as f:
35
+ sql_content = f.read()
36
  st.text_area("SQL Content", sql_content, height=300)
37
 
 
38
  elif page == "Preprocess Data":
39
  st.title("Preprocess Uploaded CSV")
40
+ files = [f for f in os.listdir("uploads") if f.endswith(".csv")]
41
 
42
  if files:
43
  selected_file = st.selectbox("Select a CSV file to preprocess", files)
44
+ file_path = os.path.join("uploads", selected_file)
45
 
46
  if "df" not in st.session_state or st.session_state.file_path != file_path:
47
  st.session_state.df = pd.read_csv(file_path)
 
60
  st.session_state.df = st.session_state.df.replace(missing_placeholders, pd.NA)
61
  st.session_state.df = st.session_state.df.dropna()
62
  st.success("All placeholder and missing values dropped!")
63
+ missing_after = st.session_state.df.isnull().sum()
64
+ st.write("Missing values per column AFTER drop:")
65
+ st.dataframe(missing_after.rename("Missing Count"))
66
  st.dataframe(st.session_state.df)
67
 
68
  col_to_drop = st.multiselect("Select columns to drop", st.session_state.df.columns)
 
77
  st.session_state.df[col] = le.fit_transform(st.session_state.df[col].astype(str))
78
  label_encoders[col] = le
79
 
80
+ # Save each encoder as pickle
81
  for col, le in label_encoders.items():
82
+ with open(f"encoders/{selected_file}_{col}_encoder.pkl", "wb") as f:
83
  pickle.dump(le, f)
84
 
85
  st.success("All object columns label-encoded and encoders saved!")
86
  st.dataframe(st.session_state.df)
87
 
88
  if st.button("Save Preprocessed File"):
89
+ processed_path = os.path.join("processed", selected_file)
90
  st.session_state.df.to_csv(processed_path, index=False)
91
  st.success(f"Preprocessed file saved to: {processed_path}")
92
  else:
93
  st.warning("No CSV files available. Please upload a CSV first.")
94
 
 
95
  elif page == "Train & Select Model":
96
  st.title("Train Models and Select the Best One")
97
 
98
+ processed_files = [f for f in os.listdir("processed") if f.endswith(".csv")]
99
 
100
  if processed_files:
101
  selected_file = st.selectbox("Select a processed CSV", processed_files)
102
+ file_path = os.path.join("processed", selected_file)
103
 
104
  df = pd.read_csv(file_path)
105
  st.dataframe(df.head())
 
137
  else:
138
  models = {
139
  "Linear Regression": LinearRegression(),
140
+ "Decision Tree": DecisionTreeClassifier()
141
  }
142
  for name, model in models.items():
143
  model.fit(X_train, y_train)
 
152
  selected_model_name = st.selectbox("Select model to save", list(results.keys()))
153
  if st.button("Save Selected Model"):
154
  final_model = models[selected_model_name]
155
+ pkl_path = os.path.join("pkl", f"{selected_model_name}.pkl")
156
  with open(pkl_path, "wb") as f:
157
  pickle.dump(final_model, f)
158
  st.success(f"Model saved as {pkl_path}")
159
  else:
160
  st.warning("No processed files found. Please preprocess a file first.")
161
 
 
162
  elif page == "Create App":
163
  st.title("Use Model for Prediction")
164
 
165
+ processed_files = [f for f in os.listdir("processed") if f.endswith(".csv")]
166
  if processed_files:
167
  selected_csv = st.selectbox("Select a processed CSV file", processed_files)
168
+ df = pd.read_csv(os.path.join("processed", selected_csv))
169
  target_col = st.selectbox("Select target column", df.columns)
170
 
171
  if target_col:
 
181
 
182
  model.fit(X, y)
183
 
184
+ # Load encoders for features if available
185
  encoders = {}
186
  for col in X.columns:
187
+ encoder_path = f"encoders/{selected_csv}_{col}_encoder.pkl"
188
  if os.path.exists(encoder_path):
189
  with open(encoder_path, "rb") as f:
190
  encoders[col] = pickle.load(f)
191
 
192
+ # Load encoder for target if available (for inverse transform of prediction)
193
  target_encoder = None
194
+ target_encoder_path = f"encoders/{selected_csv}_{target_col}_encoder.pkl"
195
  if os.path.exists(target_encoder_path):
196
  with open(target_encoder_path, "rb") as f:
197
  target_encoder = pickle.load(f)
 
220
  else:
221
  st.text(prediction[0])
222
  else:
223
+ st.warning("No processed CSV files found. Please preprocess a file first.")