vihu21 commited on
Commit
5a31c46
·
verified ·
1 Parent(s): b56f314

Upload folder using huggingface_hub

Browse files
Files changed (3) hide show
  1. Dockerfile +9 -9
  2. app.py +56 -85
  3. requirements.txt +0 -8
Dockerfile CHANGED
@@ -1,16 +1,16 @@
 
1
  FROM python:3.9-slim
2
 
3
- # Set the working directory inside the container
4
  WORKDIR /app
5
 
6
- # Copy all files from the current directory to the container's working directory
7
  COPY . .
8
 
9
- # Install dependencies from the requirements file without using cache to reduce image size
10
- RUN pip install --no-cache-dir --upgrade -r requirements.txt
11
 
12
- # Define the command to start the application using Gunicorn with 4 worker processes
13
- # - `-w 4`: Uses 4 worker processes for handling requests
14
- # - `-b 0.0.0.0:7860`: Binds the server to port 7860 on all network interfaces
15
- # - `app:app`: Runs the Flask app (assuming `app.py` contains the Flask instance named `app`)
16
- CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:7860", "app:extralearn_predictor_api"]
 
1
+ # Use a minimal base image with Python 3.9 installed
2
  FROM python:3.9-slim
3
 
4
+ # Set the working directory inside the container to /app
5
  WORKDIR /app
6
 
7
+ # Copy all files from the current directory on the host to the container's /app directory
8
  COPY . .
9
 
10
+ # Install Python dependencies listed in requirements.txt
11
+ RUN pip3 install -r requirements.txt
12
 
13
+ # Define the command to run the Streamlit app on port 8501 and make it accessible externally
14
+ CMD ["streamlit", "run", "app.py", "--server.port=8501", "--server.address=0.0.0.0", "--server.enableXsrfProtection=false"]
15
+
16
+ # NOTE: Disable XSRF protection for easier external access in order to make status predictions
 
app.py CHANGED
@@ -1,85 +1,56 @@
1
- # Import necessary libraries
2
- import numpy as np
3
- import joblib # For loading the serialized model
4
- import pandas as pd # For data manipulation
5
- from flask import Flask, request, jsonify # For creating the Flask API
6
-
7
- # Initialize the Flask application
8
- extralearn_predictor_api = Flask("extra Learn Status Predictor")
9
-
10
- # Load the trained machine learning model
11
- model = joblib.load("extralearn.joblib")
12
-
13
- # Define a route for the home page (GET request)
14
- @extralearn_predictor_api.get('/')
15
- def home():
16
- """
17
- This function handles GET requests to the root URL ('/') of the API.
18
- It returns a simple welcome message.
19
- """
20
- return "Welcome to the Airbnb Rental Price Prediction API!"
21
-
22
- # Define an endpoint for single property prediction (POST request)
23
- @extralearn_predictor_api.post('/v1/extralearn')
24
- def predict_extralearn():
25
- """
26
- This function handles POST requests to the '/v1/extralearn' endpoint.
27
- It expects a JSON payload containing property details and returns
28
- the predicted rental price as a JSON response.
29
- """
30
- # Get the JSON data from the request body
31
- extralearn_data = request.get_json()
32
-
33
- # Extract relevant features from the JSON data
34
- sample = {
35
- 'age': extralearn_data['age'],
36
- 'profile_completed': extralearn_data['profile_completed'],
37
- 'current_occupation': extralearn_data['current_occupation'],
38
- 'first_interaction': extralearn_data['first_interaction'],
39
- 'last_activity': extralearn_data['last_activity'],
40
- 'referral': extralearn_data['referral'],
41
- 'digital_media': extralearn_data['digital_media']
42
- }
43
-
44
- # Convert the extracted data into a Pandas DataFrame
45
- input_data = pd.DataFrame([sample])
46
-
47
- # Make prediction (get log_price)
48
- predicted_status = model.predict(input_data)[0]
49
-
50
-
51
-
52
- # Return the actual price
53
- return jsonify({'Predicted Status': predicted_status})
54
-
55
-
56
- # Define an endpoint for batch prediction (POST request)
57
- @extralearn_predictor_api.post('/v1/extralearnbatch')
58
- def predict_rental_price_batch():
59
- """
60
- This function handles POST requests to the '/v1/extralearnbatch' endpoint.
61
- It expects a CSV file containing property details for multiple properties
62
- and returns the predicted rental prices as a dictionary in the JSON response.
63
- """
64
- # Get the uploaded CSV file from the request
65
- file = request.files['file']
66
-
67
- # Read the CSV file into a Pandas DataFrame
68
- input_data = pd.read_csv(file)
69
-
70
- # Make predictions for all properties in the DataFrame (get log_prices)
71
- predicted_status = model.predict(input_data).tolist()
72
-
73
-
74
-
75
- # Create a dictionary to store the predictions
76
- output_dict = {
77
- 'Predicted Status': predicted_status
78
- }
79
-
80
- # Return the predictions dictionary as a JSON response
81
- return output_dict
82
-
83
- # Run the Flask application in debug mode if this script is executed directly
84
- if __name__ == '__main__':
85
- extralearn_predictor_api.run(debug=True)
 
1
+ import streamlit as st
2
+ import pandas as pd
3
+ import requests
4
+
5
+ # Set the title of the Streamlit app
6
+ st.title("Extra Learn Status Prediction")
7
+
8
+ # Section for online prediction
9
+ st.subheader("Online Prediction")
10
+
11
+ # Collect user input for property features
12
+ age = st.number_input("age", min_value=1, value=75)
13
+ profile_completed = st.selectbox("profile_completed", ["Yes", "No"])
14
+ current_occupation = st.selectbox("current_occupation", ["Unemployed", "Professional", "Student"])
15
+ last_activity =st.selectbox("last_activity", ["Yes", "No"])
16
+ first_interaction = st.selectbox("first_interaction", ["Yes", "No"])
17
+ referral = st.selectbox("referral", ["Yes", "No"])
18
+ digital_media = st.selectbox("digital_media", ["Yes", "No"])
19
+
20
+ # Convert user input into a DataFrame
21
+ input_data = pd.DataFrame([{
22
+ 'age': age,
23
+ 'profile_completed': profile_completed,
24
+ 'current_occupation': current_occupation,
25
+ 'first_interaction': first_interaction,
26
+ 'last_activity':last_activity,
27
+ 'referral': referral,
28
+ 'digital_media': digital_media
29
+ }])
30
+
31
+
32
+ # Make prediction when the "Predict" button is clicked
33
+ if st.button("Predict"):
34
+ response = requests.post("https://<username>-<repo_id>.hf.space/v1/rental", json=input_data.to_dict(orient='records')[0]) # Send data to Flask API
35
+ if response.status_code == 200:
36
+ prediction = response.json()['Predicted Status']
37
+ st.success(f"Predicted Status: {prediction}")
38
+ else:
39
+ st.error("Error making prediction.")
40
+
41
+ # Section for batch prediction
42
+ st.subheader("Status Prediction")
43
+
44
+ # Allow users to upload a CSV file for batch prediction
45
+ uploaded_file = st.file_uploader("Upload CSV file for Status prediction", type=["csv"])
46
+
47
+ # Make batch prediction when the "Predict Batch" button is clicked
48
+ if uploaded_file is not None:
49
+ if st.button("Predict Status"):
50
+ response = requests.post("https://<username>-<repo_id>.hf.space/v1/rentalbatch", files={"file": uploaded_file}) # Send file to Flask API
51
+ if response.status_code == 200:
52
+ predictions = response.json()
53
+ st.success("Status predictions completed!")
54
+ st.write(predictions) # Display the predictions
55
+ else:
56
+ st.error("Error making status prediction.")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
requirements.txt CHANGED
@@ -1,11 +1,3 @@
1
  pandas==2.2.2
2
- numpy==2.0.2
3
- scikit-learn==1.6.1
4
- xgboost==2.1.4
5
- joblib==1.4.2
6
- Werkzeug==2.2.2
7
- flask==2.2.2
8
- gunicorn==20.1.0
9
  requests==2.28.1
10
- uvicorn[standard]
11
  streamlit==1.43.2
 
1
  pandas==2.2.2
 
 
 
 
 
 
 
2
  requests==2.28.1
 
3
  streamlit==1.43.2