Files
hpos-data/cloud-functions/python/functions/crdboxplot/main.py
2024-02-13 20:08:12 +05:30

83 lines
2.4 KiB
Python

import functions_framework
from flask import Flask, jsonify, send_file
from flask_cors import CORS
import matplotlib.pyplot as plt
from matplotlib.backends.backend_svg import FigureCanvasSVG
import io
import os
from firebase_admin import initialize_app, firestore
import datetime
import pandas as pd
from google.cloud.firestore import FieldFilter
app = Flask(__name__)
CORS(app)
initialize_app()
def create_svg_plot():
db = firestore.client()
test_collection = db.collection("testData")
data = []
current_datetime = datetime.datetime.now()
start_datetime = current_datetime.replace(hour=0, minute=0, second=0, microsecond=0)
start_date = start_datetime.strftime('%Y-%m-%d')
end_datetime = start_datetime + datetime.timedelta(days=1)
end_date = end_datetime.strftime('%Y-%m-%d')
test_docs = test_collection.where(filter=FieldFilter('testTime', '>=', start_date)).where(filter=FieldFilter('testTime', '<', end_date)).stream()
for test_doc in test_docs:
test_data = test_doc.to_dict()
data.append(test_data)
df = pd.DataFrame(data)
fig, ax = plt.subplots()
box_plot = df.boxplot(column='deviceRatio', by='classificationResult', vert=True, ax=ax)
# plt.title('Box Plot of Device Ratio by Classification Result')
plt.xlabel('Classification Result')
plt.ylabel('Device Ratio')
svg_output = io.StringIO()
canvas = FigureCanvasSVG(fig)
canvas.print_svg(svg_output)
plt.close(fig)
return svg_output.getvalue()
@functions_framework.http
def crdboxplot(request):
"""HTTP Cloud Function.
Args:
request (flask.Request): The request object.
<https://flask.palletsprojects.com/en/1.1.x/api/#incoming-request-data>
Returns:
The response text, or any set of values that can be turned into a
Response object using `make_response`
<https://flask.palletsprojects.com/en/1.1.x/api/#flask.make_response>.
"""
if request.method == 'OPTIONS':
headers = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type',
# 'Access-Control-Max-Age': '3600'
}
return ('', 204, headers)
headers = {
'Access-Control-Allow-Origin': '*'
}
svg_plot = create_svg_plot()
return send_file(io.BytesIO(svg_plot.encode()), as_attachment=False, download_name="plot.svg", mimetype='image/svg+xml')