Skip to content

Commit

Permalink
done creating report and sending as email
Browse files Browse the repository at this point in the history
Stash changes before rewriting history
  • Loading branch information
sasax7 committed Jan 5, 2025
1 parent 132bb33 commit 64415c8
Show file tree
Hide file tree
Showing 10 changed files with 377 additions and 23 deletions.
2 changes: 1 addition & 1 deletion api/correlation.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from pydantic import BaseModel, ConfigDict
import pytz

from get_trend_data import fetch_pandas_data
from api.get_trend_data import fetch_pandas_data
from api.models import CorrelationRequest, LagUnit


Expand Down
4 changes: 1 addition & 3 deletions get_trend_data.py → api/get_trend_data.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
import pandas as pd
import numpy as np
from datetime import timedelta
import eliona.api_client2
from eliona.api_client2.rest import ApiException
from eliona.api_client2.api.data_api import DataApi
from eliona.api_client2.api.assets_api import AssetsApi
import os
import logging
import pytz
from datetime import datetime

from api.models import AssetAttribute

# Initialize the logger
Expand Down
5 changes: 3 additions & 2 deletions api/models.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
from pydantic import BaseModel, ConfigDict
from pydantic import BaseModel
from typing import List, Dict, Optional
from enum import Enum
from datetime import datetime
import pandas as pd


class LagUnit(str, Enum):
Expand All @@ -24,13 +23,15 @@ class CorrelationRequest(BaseModel):
lags: Optional[List[Dict[LagUnit, int]]] = None
start_time: Optional[datetime] = None
end_time: Optional[datetime] = None
to_email: Optional[str] = None


class CorrelateChildrenRequest(BaseModel):
asset_id: int
lags: Optional[List[Dict[LagUnit, int]]] = None
start_time: Optional[datetime] = None
end_time: Optional[datetime] = None
to_email: Optional[str] = None


class CorrelationResult(BaseModel):
Expand Down
129 changes: 116 additions & 13 deletions api/openapi.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,17 @@
from datetime import datetime
import pytz
import yaml
from api.models import CorrelationRequest, CorrelateChildrenRequest, AssetAttribute
from api.models import CorrelationRequest, CorrelateChildrenRequest
from api.correlation import get_data, compute_correlation
from api.plot_correlation import (
create_best_correlation_heatmap,
in_depth_plot_scatter,
plot_lag_correlations,
)
from get_trend_data import get_all_asset_children

from api.get_trend_data import get_all_asset_children
from api.pdf_template import create_pdf
from fastapi.responses import FileResponse
from api.sendEmail import send_evaluation_report_as_mail

# Create the FastAPI app instance
app = FastAPI(
Expand Down Expand Up @@ -42,35 +44,61 @@ def correlate_assets(request: CorrelationRequest):
dataframes = get_data(request)
correlations = compute_correlation(dataframes, request)
create_best_correlation_heatmap(correlations)

include_heatmap: bool = True
include_scatter: bool = False
include_lag_plots: bool = False
include_details: bool = True

pdf_file_path = "/tmp/correlation_report.pdf"
create_pdf(
request.start_time,
request.end_time,
pdf_file_path,
correlations,
include_heatmap,
include_scatter,
include_lag_plots,
include_details,
)
html_file_path = "/tmp/report.html"
with open(html_file_path, "r", encoding="utf-8") as html_file:
html_content = html_file.read()
if request.to_email:
send_evaluation_report_as_mail(pdf_file_path, request.to_email)
return {
"assets": request.assets,
"lags": request.lags,
"start_time": request.start_time,
"end_time": end_time,
"correlation": correlations,
"report_html": html_content,
}


@app.post("/v1/correlate-children")
def correlate_asset_children(request: CorrelateChildrenRequest):
end_time = request.end_time or datetime.now()
child_asset_ids = get_all_asset_children(request.asset_id)
print(f"Found {len(child_asset_ids)} children for asset {request.asset_id}")
correlation_request = CorrelationRequest(
assets=child_asset_ids,
lags=request.lags,
start_time=request.start_time,
end_time=request.end_time,
to_email=request.to_email,
)

correlations = correlate_assets(correlation_request)
response = correlate_assets(correlation_request)
correlations = response["correlation"]
html_content = response["report_html"]

return {
"assets": child_asset_ids,
"lags": request.lags,
"start_time": request.start_time,
"end_time": end_time,
"end_time": request.end_time,
"correlation": correlations,
"report_html": html_content,
}


Expand All @@ -95,24 +123,99 @@ def in_depth_correlation(request: CorrelationRequest):

correlations = compute_correlation(df_infos, request)

lag_plots = plot_lag_correlations(correlations, output_dir="/tmp/lag_plots")
lag_plot_filenames = plot_lag_correlations(
correlations, output_dir="/tmp/lag_plots"
)

try:
scatter_result = in_depth_plot_scatter(
df_infos, output_file="/tmp/in_depth_scatter.png"
)
except ValueError as e:
raise HTTPException(status_code=400, detail=str(e))
include_heatmap: bool = False
include_scatter: bool = True
include_lag_plots: bool = True
include_details: bool = True

pdf_file_path = "/tmp/correlation_report.pdf"
create_pdf(
request.start_time,
request.end_time,
pdf_file_path,
correlations,
include_heatmap,
include_scatter,
include_lag_plots,
include_details,
lag_plot_filenames,
)
html_file_path = "/tmp/report.html"
with open(html_file_path, "r", encoding="utf-8") as html_file:
html_content = html_file.read()

end_time = request.end_time or datetime.now(pytz.timezone("Europe/Berlin"))

if request.to_email:
send_evaluation_report_as_mail(pdf_file_path, request.to_email)
return {
"assets": request.assets,
"lags": request.lags,
"start_time": request.start_time,
"end_time": end_time,
"end_time": request.end_time,
"correlation": correlations,
"scatter_plot": scatter_result["plot_base64_png"],
"columns": scatter_result["columns"],
"lag_plots": lag_plots,
"scatter_result_columns": scatter_result["columns"],
"report_html": html_content,
}


@app.post("/v1/generate-report")
def generate_report(request: CorrelationRequest):
"""
Generate a PDF report for the correlation analysis.
"""
include_heatmap: bool = False
include_scatter: bool = True
include_lag_plots: bool = True
include_details: bool = True
if len(request.assets) != 2:
raise HTTPException(status_code=400, detail="Exactly two assets are required.")

# 1) Fetch data
df_infos = get_data(request)
if len(df_infos) != 2:
raise HTTPException(
status_code=400,
detail="Could not retrieve data for both assets/attributes. Check logs.",
)

correlations = compute_correlation(df_infos, request)

lag_plot_filenames = plot_lag_correlations(
correlations, output_dir="/tmp/lag_plots"
)

try:
scatter_result = in_depth_plot_scatter(
df_infos, output_file="/tmp/in_depth_scatter.png"
)
except ValueError as e:
raise HTTPException(status_code=400, detail=str(e))

end_time = request.end_time or datetime.now(pytz.timezone("Europe/Berlin"))

pdf_file_path = "/tmp/correlation_report.pdf"
create_pdf(
request.start_time,
request.end_time,
pdf_file_path,
correlations,
include_heatmap,
include_scatter,
include_lag_plots,
include_details,
lag_plot_filenames,
)
if request.to_email:
send_evaluation_report_as_mail(pdf_file_path, request.to_email)
return FileResponse(
pdf_file_path, media_type="application/pdf", filename="correlation_report.pdf"
)
Loading

0 comments on commit 64415c8

Please sign in to comment.