Learning_Agent / utils.py
cryogenic22's picture
Create utils.py
f3ed66a verified
raw
history blame
4.26 kB
# utils.py
import json
from datetime import datetime
import streamlit as st
import plotly.graph_objects as go
import plotly.express as px
import re
import pdfkit
from jinja2 import Template
class ReportManager:
def __init__(self):
if 'reports' not in st.session_state:
st.session_state.reports = {}
def save_report(self, topic: str, report_data: dict):
"""Save a new report with timestamp"""
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
report_id = f"{topic}_{timestamp}"
st.session_state.reports[report_id] = {
'topic': topic,
'timestamp': timestamp,
'exec_summary': report_data.get('exec_summary', ''),
'detailed_report': report_data.get('detailed_report', ''),
'sources': report_data.get('sources', []),
'charts': report_data.get('charts', [])
}
return report_id
def get_report(self, report_id: str):
"""Retrieve a specific report"""
return st.session_state.reports.get(report_id)
def get_all_reports(self):
"""Get all saved reports"""
return st.session_state.reports
def generate_visualizations(self, report_text: str):
"""Generate relevant visualizations based on report content"""
charts = []
# Extract numerical data using regex patterns
market_size_pattern = r"\$\s*(\d+(?:\.\d+)?)\s*(?:billion|million|trillion)"
growth_rate_pattern = r"(\d+(?:\.\d+)?)\s*%"
# Market size data
market_sizes = re.findall(market_size_pattern, report_text)
if market_sizes:
fig = go.Figure(data=[
go.Bar(
x=['Current Market Size', 'Projected Size'],
y=[float(market_sizes[0]), float(market_sizes[-1])],
text=[f'${x}B' for x in market_sizes],
textposition='auto',
)
])
fig.update_layout(title='Market Size Projection')
charts.append(fig)
# Growth rate data
growth_rates = re.findall(growth_rate_pattern, report_text)
if growth_rates:
fig = go.Figure(data=[
go.Line(
x=list(range(len(growth_rates))),
y=[float(x) for x in growth_rates],
mode='lines+markers'
)
])
fig.update_layout(title='Growth Rate Trends')
charts.append(fig)
return charts
def generate_pdf(self, report_id: str):
"""Generate PDF version of the report"""
report = self.get_report(report_id)
if not report:
return None
# HTML template for PDF
template_str = """
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: Arial, sans-serif; }
.header { text-align: center; margin-bottom: 30px; }
.section { margin: 20px 0; }
.charts { text-align: center; }
</style>
</head>
<body>
<div class="header">
<h1>{{ report.topic }} - Market Research Report</h1>
<p>Generated on: {{ report.timestamp }}</p>
</div>
<div class="section">
<h2>Executive Summary</h2>
{{ report.exec_summary }}
</div>
<div class="section">
<h2>Detailed Analysis</h2>
{{ report.detailed_report }}
</div>
<div class="section">
<h2>Sources</h2>
<ul>
{% for source in report.sources %}
<li>{{ source }}</li>
{% endfor %}
</ul>
</div>
</body>
</html>
"""
# Render template
template = Template(template_str)
html = template.render(report=report)
# Convert to PDF
try:
pdf = pdfkit.from_string(html, False)
return pdf
except Exception as e:
st.error(f"Error generating PDF: {str(e)}")
return None