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

first push

Browse files
Files changed (2) hide show
  1. requirements.txt +3 -2
  2. src/streamlit_app.py +25 -22
requirements.txt CHANGED
@@ -1,4 +1,5 @@
1
  altair
2
- pandas
3
  streamlit
4
- scikit-learn
 
 
 
1
  altair
 
2
  streamlit
3
+ pandas
4
+ scikit-learn
5
+ huggingface_hub
src/streamlit_app.py CHANGED
@@ -9,20 +9,26 @@ 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}")
@@ -37,11 +43,11 @@ if page == "Upload File":
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)
@@ -77,16 +83,15 @@ elif page == "Preprocess Data":
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:
@@ -95,11 +100,11 @@ elif page == "Preprocess Data":
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())
@@ -147,12 +152,12 @@ elif page == "Train & Select Model":
147
 
148
  st.subheader("Model Accuracy / Score")
149
  for model_name, score in results.items():
150
- st.write(f"{model_name}: **{score:.4f}**")
151
 
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}")
@@ -162,10 +167,10 @@ elif page == "Train & Select Model":
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,17 +186,15 @@ elif page == "Create App":
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,4 +223,4 @@ elif page == "Create App":
220
  else:
221
  st.text(prediction[0])
222
  else:
223
- st.warning("No processed CSV files found. Please preprocess a file first.")
 
9
  from sklearn.tree import DecisionTreeClassifier
10
  from sklearn.metrics import accuracy_score, r2_score
11
 
12
+ # Writable folders inside /tmp
13
+ BASE_DIR = "/tmp/ml_app"
14
+ UPLOAD_DIR = os.path.join(BASE_DIR, "uploads")
15
+ PROCESSED_DIR = os.path.join(BASE_DIR, "processed")
16
+ PKL_DIR = os.path.join(BASE_DIR, "pkl")
17
+ ENCODERS_DIR = os.path.join(BASE_DIR, "encoders")
18
+
19
+ # Create them at runtime
20
+ for d in [UPLOAD_DIR, PROCESSED_DIR, PKL_DIR, ENCODERS_DIR]:
21
+ os.makedirs(d, exist_ok=True)
22
+
23
  st.sidebar.title("Navigation")
24
  page = st.sidebar.selectbox("Go to", ["Upload File", "Preprocess Data", "Train & Select Model", "Create App"])
25
 
 
 
 
 
 
26
  if page == "Upload File":
27
  st.title("Upload CSV or SQL File")
28
  uploaded_file = st.file_uploader("Upload a CSV or SQL file", type=["csv", "sql"])
29
 
30
  if uploaded_file is not None:
31
+ save_path = os.path.join(UPLOAD_DIR, uploaded_file.name)
32
  with open(save_path, "wb") as f:
33
  f.write(uploaded_file.getbuffer())
34
  st.success(f"File saved to {save_path}")
 
43
 
44
  elif page == "Preprocess Data":
45
  st.title("Preprocess Uploaded CSV")
46
+ files = [f for f in os.listdir(UPLOAD_DIR) if f.endswith(".csv")]
47
 
48
  if files:
49
  selected_file = st.selectbox("Select a CSV file to preprocess", files)
50
+ file_path = os.path.join(UPLOAD_DIR, selected_file)
51
 
52
  if "df" not in st.session_state or st.session_state.file_path != file_path:
53
  st.session_state.df = pd.read_csv(file_path)
 
83
  st.session_state.df[col] = le.fit_transform(st.session_state.df[col].astype(str))
84
  label_encoders[col] = le
85
 
 
86
  for col, le in label_encoders.items():
87
+ with open(os.path.join(ENCODERS_DIR, f"{selected_file}_{col}_encoder.pkl"), "wb") as f:
88
  pickle.dump(le, f)
89
 
90
  st.success("All object columns label-encoded and encoders saved!")
91
  st.dataframe(st.session_state.df)
92
 
93
  if st.button("Save Preprocessed File"):
94
+ processed_path = os.path.join(PROCESSED_DIR, selected_file)
95
  st.session_state.df.to_csv(processed_path, index=False)
96
  st.success(f"Preprocessed file saved to: {processed_path}")
97
  else:
 
100
  elif page == "Train & Select Model":
101
  st.title("Train Models and Select the Best One")
102
 
103
+ processed_files = [f for f in os.listdir(PROCESSED_DIR) if f.endswith(".csv")]
104
 
105
  if processed_files:
106
  selected_file = st.selectbox("Select a processed CSV", processed_files)
107
+ file_path = os.path.join(PROCESSED_DIR, selected_file)
108
 
109
  df = pd.read_csv(file_path)
110
  st.dataframe(df.head())
 
152
 
153
  st.subheader("Model Accuracy / Score")
154
  for model_name, score in results.items():
155
+ st.write(f"{model_name}: *{score:.4f}*")
156
 
157
  selected_model_name = st.selectbox("Select model to save", list(results.keys()))
158
  if st.button("Save Selected Model"):
159
  final_model = models[selected_model_name]
160
+ pkl_path = os.path.join(PKL_DIR, f"{selected_model_name}.pkl")
161
  with open(pkl_path, "wb") as f:
162
  pickle.dump(final_model, f)
163
  st.success(f"Model saved as {pkl_path}")
 
167
  elif page == "Create App":
168
  st.title("Use Model for Prediction")
169
 
170
+ processed_files = [f for f in os.listdir(PROCESSED_DIR) if f.endswith(".csv")]
171
  if processed_files:
172
  selected_csv = st.selectbox("Select a processed CSV file", processed_files)
173
+ df = pd.read_csv(os.path.join(PROCESSED_DIR, selected_csv))
174
  target_col = st.selectbox("Select target column", df.columns)
175
 
176
  if target_col:
 
186
 
187
  model.fit(X, y)
188
 
 
189
  encoders = {}
190
  for col in X.columns:
191
+ encoder_path = os.path.join(ENCODERS_DIR, f"{selected_csv}_{col}_encoder.pkl")
192
  if os.path.exists(encoder_path):
193
  with open(encoder_path, "rb") as f:
194
  encoders[col] = pickle.load(f)
195
 
 
196
  target_encoder = None
197
+ target_encoder_path = os.path.join(ENCODERS_DIR, f"{selected_csv}_{target_col}_encoder.pkl")
198
  if os.path.exists(target_encoder_path):
199
  with open(target_encoder_path, "rb") as f:
200
  target_encoder = pickle.load(f)
 
223
  else:
224
  st.text(prediction[0])
225
  else:
226
+ st.warning("No processed CSV files found. Please preprocess a file first.")