Spaces:
Sleeping
Sleeping
File size: 4,260 Bytes
f3ed66a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | # 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 |