mlAPI / main.py
deepak6593's picture
adding files
ebaba5e
from fastapi import FastAPI, File, UploadFile, Form
from fastapi import APIRouter, Depends, HTTPException, status
import pandas as pd
from google.cloud import storage
import io
import os
import tempfile
from pydantic import BaseModel
app = FastAPI()
gcs_bucket_name = "ow-stu-us-ce1-ai-platform"
# process of getting credentials
def get_credentials():
creds_json_str = os.getenv("BOB") # get json credentials stored as a string
if creds_json_str is None:
raise ValueError("GOOGLE_APPLICATION_CREDENTIALS_JSON not found in environment")
# create a temporary file
with tempfile.NamedTemporaryFile(mode="w+", delete=False, suffix=".json") as temp:
temp.write(creds_json_str) # write in json format
temp_filename = temp.name
return temp_filename
# pass
os.environ["GOOGLE_APPLICATION_CREDENTIALS"]= get_credentials()
# Ensure the GCS bucket exists
gcs_client = storage.Client()
gcs_bucket = gcs_client.bucket(gcs_bucket_name)
# File path in GCS bucket
gcs_file_path = "deepak_6593/db.csv"
def append_to_gcs_csv(new_data, gcs_file_path):
# Standardize column names for new data
new_data.columns = ['category', 'score']
# Check if the file exists in GCS bucket
blob = gcs_bucket.blob(gcs_file_path)
if exists := blob.exists():
existing_data = pd.read_csv(io.BytesIO(blob.download_as_bytes()))
# Ensure existing data has the right columns
existing_data = existing_data[['category', 'score']]
# Append new data to existing data
combined_data = pd.concat([existing_data, new_data], ignore_index=True).dropna(how='all')
else:
combined_data = new_data
# Convert combined DataFrame to CSV and upload it
csv_data = combined_data.to_csv(index=False).encode('utf-8')
blob.upload_from_string(csv_data, content_type='text/csv')
def read_from_gcs_csv(gcs_file_path):
blob = gcs_bucket.blob(gcs_file_path)
return pd.read_csv(io.BytesIO(blob.download_as_text()))
@app.post("/upload-file/")
async def upload_file(file: UploadFile = File(...)):
df = pd.read_csv(io.StringIO((await file.read()).decode('utf-8')))
append_to_gcs_csv(df, gcs_file_path)
return {"message": "File uploaded successfully"}
@app.post("/upload-data/")
async def upload_data(category: str = Form(...), score: float = Form(...)):
try:
df = pd.DataFrame([[category, score]], columns=['category', 'score'])
append_to_gcs_csv(df, gcs_file_path)
return {"message": "Data uploaded successfully"}
except Exception as e:
raise HTTPException(status_code=422, detail=str(e))
@app.post("/upload-data-raw/")
async def upload_data_raw(payload: dict):
# sourcery skip: raise-from-previous-error
try:
category = payload['category']
score = payload['score']
except KeyError:
raise HTTPException(status_code=400, detail="Invalid payload format")
df = pd.DataFrame([[category, score]], columns=['category', 'score'])
append_to_gcs_csv(df, gcs_file_path)
return {"message": "Data uploaded successfully"}
@app.post("/clear-data/")
async def clear_data():
# Create an empty DataFrame with the same columns
empty_df = pd.DataFrame(columns=['category', 'score'])
# Convert the empty DataFrame to CSV
csv_data = empty_df.to_csv(index=False).encode('utf-8')
# Overwrite the existing file in GCS with the empty CSV data
gcs_bucket.blob(gcs_file_path).upload_from_string(csv_data, content_type='text/csv')
return {"message": "Data cleared successfully"}