RDA9527 commited on
Commit
365b87c
·
verified ·
1 Parent(s): 89adb7c

Upload 4 files

Browse files
Files changed (3) hide show
  1. Dockerfile +3 -4
  2. server.py +13 -9
  3. server_requirements.txt +11 -0
Dockerfile CHANGED
@@ -1,4 +1,3 @@
1
- # Use the official slim Python 3.9 image as the base image
2
  FROM python:3.9-slim
3
 
4
  # Set the working directory inside the container
@@ -8,10 +7,10 @@ WORKDIR /app
8
  COPY . .
9
 
10
  # Install dependencies from the requirements file without using cache to reduce image size
11
- RUN pip install --no-cache-dir --upgrade -r requirements.txt
12
 
13
  # Define the command to start the application using Gunicorn with 4 worker processes
14
  # - `-w 4`: Uses 4 worker processes for handling requests
15
  # - `-b 0.0.0.0:7860`: Binds the server to port 7860 on all network interfaces
16
- # - `app:app`: Runs the Flask app (assuming `server.py` contains the Flask instance named `app`)
17
- CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:7860", "python server.py & streamlit run app.py"]
 
 
1
  FROM python:3.9-slim
2
 
3
  # Set the working directory inside the container
 
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 server_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:server"]
server.py CHANGED
@@ -9,16 +9,16 @@ app = Flask("Customer Churn Predictor")
9
  model = joblib.load("churn_prediction_model_v1_0.joblib")
10
 
11
  # Define a route for the home page
12
- # @app.get('/')
13
- # def home():
14
- # return "Welcome to the Customer Churn Prediction API!"
15
 
16
  # Define an endpoint to predict churn for a single customer
17
  @app.post('/v1/customer')
18
  def predict_churn():
19
  # Get JSON data from the request
20
  customer_data = request.get_json()
21
-
22
  # Extract relevant customer features from the input data
23
  sample = {
24
  'CreditScore': customer_data['CreditScore'],
@@ -31,7 +31,7 @@ def predict_churn():
31
  'IsActiveMember': customer_data['IsActiveMember'],
32
  'EstimatedSalary': customer_data['EstimatedSalary']
33
  }
34
-
35
  # Convert the extracted data into a DataFrame
36
  input_data = pd.DataFrame([sample])
37
 
@@ -40,7 +40,7 @@ def predict_churn():
40
 
41
  # Map prediction result to a human-readable label
42
  prediction_label = "churn" if prediction == 1 else "not churn"
43
-
44
  # Return the prediction as a JSON response
45
  return jsonify({'Churn expected?': prediction_label})
46
 
@@ -53,8 +53,12 @@ def predict_churn_batch():
53
  # Read the file into a DataFrame
54
  input_data = pd.read_csv(file)
55
 
56
- # Make predictions for the batch data
57
- predictions = ['Churn' if x == 1 else "Not Churn" for x in model.predict(input_data.drop("CustomerId",axis=1)).tolist()]
 
 
 
 
58
 
59
  cust_id_list = input_data.CustomerId.values.tolist()
60
  output_dict = dict(zip(cust_id_list, predictions))
@@ -63,4 +67,4 @@ def predict_churn_batch():
63
 
64
  # Run the Flask app in debug mode
65
  if __name__ == '__main__':
66
- app.run(debug=True)
 
9
  model = joblib.load("churn_prediction_model_v1_0.joblib")
10
 
11
  # Define a route for the home page
12
+ @app.get('/')
13
+ def home():
14
+ return "Welcome to the Customer Churn Prediction API!"
15
 
16
  # Define an endpoint to predict churn for a single customer
17
  @app.post('/v1/customer')
18
  def predict_churn():
19
  # Get JSON data from the request
20
  customer_data = request.get_json()
21
+
22
  # Extract relevant customer features from the input data
23
  sample = {
24
  'CreditScore': customer_data['CreditScore'],
 
31
  'IsActiveMember': customer_data['IsActiveMember'],
32
  'EstimatedSalary': customer_data['EstimatedSalary']
33
  }
34
+
35
  # Convert the extracted data into a DataFrame
36
  input_data = pd.DataFrame([sample])
37
 
 
40
 
41
  # Map prediction result to a human-readable label
42
  prediction_label = "churn" if prediction == 1 else "not churn"
43
+
44
  # Return the prediction as a JSON response
45
  return jsonify({'Churn expected?': prediction_label})
46
 
 
53
  # Read the file into a DataFrame
54
  input_data = pd.read_csv(file)
55
 
56
+ # Make predictions for the batch data and convert raw predictions into a readable format
57
+ predictions = [
58
+ 'Churn' if x == 1
59
+ else "Not Churn"
60
+ for x in model.predict(input_data.drop("CustomerId",axis=1)).tolist()
61
+ ]
62
 
63
  cust_id_list = input_data.CustomerId.values.tolist()
64
  output_dict = dict(zip(cust_id_list, predictions))
 
67
 
68
  # Run the Flask app in debug mode
69
  if __name__ == '__main__':
70
+ app.run(debug=True)
server_requirements.txt ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
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