entropy25 commited on
Commit
f9cfedc
Β·
verified Β·
1 Parent(s): c83325f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +370 -95
app.py CHANGED
@@ -5,169 +5,444 @@ import plotly.express as px
5
  import plotly.graph_objects as go
6
  from datetime import datetime, timedelta
7
  import random
8
- from io import BytesIO
9
  import base64
 
10
 
11
  # Page config
12
  st.set_page_config(
13
  page_title="ESG Compliance Intelligence",
14
  page_icon="🌱",
15
- layout="wide"
 
16
  )
17
 
18
- # CSS styling
19
  st.markdown("""
20
  <style>
21
- .metric-card {
22
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
23
- padding: 1rem; border-radius: 10px; color: white; text-align: center;
24
- }
25
- .alert-red { background: #fee2e2; border-left: 4px solid #dc2626; padding: 1rem; }
26
- .alert-green { background: #d1fae5; border-left: 4px solid #059669; padding: 1rem; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  </style>
28
  """, unsafe_allow_html=True)
29
 
30
- # Generate mock data
 
 
 
 
 
 
 
 
 
 
31
  @st.cache_data
32
- def generate_realtime_data():
33
- now = datetime.now()
34
- data = []
35
- for i in range(24):
36
- time_point = now - timedelta(hours=i)
37
- data.append({
38
- 'time': time_point.strftime('%H:%M'),
39
- 'ph_level': 7.2 + random.uniform(-0.3, 0.3),
40
- 'wastewater': 45 + random.uniform(-5, 10),
41
- 'co2_emission': 12.5 + random.uniform(-2, 3),
42
- 'energy_consumption': 85 + random.uniform(-10, 15)
43
- })
44
- return pd.DataFrame(data)
45
 
46
- def generate_carbon_data():
 
47
  return pd.DataFrame({
48
- 'source': ['Fuel', 'Electricity', 'Chemicals', 'Transport'],
49
  'co2_kg': [145.2, 67.8, 89.1, 19.6],
50
  'percentage': [45, 21, 28, 6]
51
  })
52
 
53
- def generate_psa_report():
54
- """Generate PSA compliance report"""
55
- report_id = f"PSA-ENV-{datetime.now().strftime('%Y%m%d%H%M')}"
56
- return {
57
- 'report_id': report_id,
58
  'timestamp': datetime.now().isoformat(),
59
- 'location': 'Statoil Platform Alpha',
60
- 'ph_level': 7.4,
61
- 'wastewater_volume': 487.2,
62
- 'co2_total': 321.7,
63
- 'compliance_status': random.choice(['COMPLIANT', 'WARNING', 'VIOLATION'])
 
 
 
64
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
 
66
  # Main app
67
  def main():
68
- st.title("🌱 ESG & Compliance Intelligence Engine")
69
- st.subheader("Norwegian Petroleum Safety Authority (PSA) Real-time Monitoring")
 
 
 
 
 
70
 
71
- # Sidebar
72
  with st.sidebar:
73
- st.header("Controls")
74
- auto_refresh = st.checkbox("Auto-refresh data", value=True)
75
- if st.button("Generate PSA Report"):
76
- report = generate_psa_report()
 
 
 
 
 
 
 
 
 
77
  st.success(f"Report Generated: {report['report_id']}")
 
 
 
 
 
 
 
 
 
 
78
  st.json(report)
 
 
 
 
 
 
 
 
 
 
79
 
80
- # Data
81
- df_realtime = generate_realtime_data()
82
- df_carbon = generate_carbon_data()
83
-
84
- # Status alerts
85
- compliance_status = random.choice(['COMPLIANT', 'WARNING', 'VIOLATION'])
86
- if compliance_status == 'VIOLATION':
87
- st.markdown('<div class="alert-red">⚠️ ALERT: Wastewater discharge exceeds PSA limits!</div>',
88
- unsafe_allow_html=True)
89
- elif compliance_status == 'WARNING':
90
- st.markdown('<div class="alert-red">⚠️ WARNING: pH level approaching upper limit</div>',
91
- unsafe_allow_html=True)
 
 
 
 
 
 
92
  else:
93
- st.markdown('<div class="alert-green">βœ… All systems compliant with PSA regulations</div>',
94
- unsafe_allow_html=True)
 
 
 
95
 
96
  # Metrics row
 
 
97
  col1, col2, col3, col4 = st.columns(4)
98
 
99
  with col1:
100
- st.metric("Compliance Status",
101
- "COMPLIANT" if compliance_status == 'COMPLIANT' else "ALERT",
102
- delta="Normal" if compliance_status == 'COMPLIANT' else "Action Required")
 
 
 
103
 
104
  with col2:
105
- current_ph = df_realtime.iloc[0]['ph_level']
106
- st.metric("Water pH Level", f"{current_ph:.1f}",
107
- delta=f"{current_ph - 7.2:.1f}" if current_ph > 7.2 else None)
 
 
 
108
 
109
  with col3:
110
- total_co2 = df_carbon['co2_kg'].sum()
111
- st.metric("Total COβ‚‚", f"{total_co2:.1f} kg", delta="-12.3 kg")
 
 
 
112
 
113
  with col4:
114
- current_energy = df_realtime.iloc[0]['energy_consumption']
115
- st.metric("Energy Usage", f"{current_energy:.0f} kWh", delta="5.2 kWh")
 
 
 
116
 
117
- # Charts
118
  col1, col2 = st.columns(2)
119
 
120
  with col1:
121
- st.subheader("Real-time Environmental Monitoring")
122
- fig_line = px.line(df_realtime, x='time', y=['ph_level', 'wastewater'],
123
- title="pH Level & Wastewater Discharge")
124
- fig_line.update_layout(height=400)
 
 
 
125
  st.plotly_chart(fig_line, use_container_width=True)
 
126
 
127
  with col2:
128
- st.subheader("Carbon Footprint Breakdown")
129
- fig_bar = px.bar(df_carbon, x='source', y='co2_kg',
130
- title="COβ‚‚ Emissions by Source")
 
 
 
 
131
  fig_bar.update_layout(height=400)
132
  st.plotly_chart(fig_bar, use_container_width=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
 
134
  # PSA Reports Table
135
- st.subheader("PSA Compliance Reports History")
 
136
 
137
- reports_data = pd.DataFrame({
 
138
  'Report ID': ['PSA-ENV-2024-001', 'PSA-ENV-2024-002', 'PSA-ENV-2024-003'],
139
  'Generated': ['2024-08-27 14:30', '2024-08-27 10:15', '2024-08-26 16:45'],
140
  'Location': ['Statoil Platform Alpha', 'Equinor Platform Beta', 'Aker BP Platform Gamma'],
141
- 'Status': ['COMPLIANT', 'WARNING', 'COMPLIANT'],
142
  'COβ‚‚ (kg)': [321.7, 345.2, 298.1]
143
  })
144
 
145
- st.dataframe(reports_data, use_container_width=True)
 
 
 
 
 
146
 
147
- # Download buttons
148
  col1, col2, col3 = st.columns(3)
 
149
  with col1:
150
- if st.button("πŸ“„ Download PDF Report"):
151
- st.success("PDF report generated successfully!")
 
 
 
 
 
 
 
 
 
152
  with col2:
153
- if st.button("πŸ“Š Export Excel"):
154
- st.success("Excel file exported!")
 
 
 
 
 
 
 
 
155
  with col3:
156
- if st.button("πŸ“‹ PSA Submission"):
157
- st.success("Report submitted to PSA portal!")
 
 
 
 
158
 
159
  # Footer
160
- st.markdown("---")
161
  st.markdown("""
162
- πŸ”’ **Security**: AES-256 encryption |
163
- πŸ“Š **Updates**: Real-time every 5 seconds |
164
- βœ… **Compliance**: GDPR & Norwegian Data Protection
165
- """)
166
-
167
- # Auto-refresh
168
- if auto_refresh:
169
- time.sleep(5)
170
- st.rerun()
171
 
172
  if __name__ == "__main__":
173
  main()
 
5
  import plotly.graph_objects as go
6
  from datetime import datetime, timedelta
7
  import random
8
+ from io import StringIO, BytesIO
9
  import base64
10
+ import json
11
 
12
  # Page config
13
  st.set_page_config(
14
  page_title="ESG Compliance Intelligence",
15
  page_icon="🌱",
16
+ layout="wide",
17
+ initial_sidebar_state="expanded"
18
  )
19
 
20
+ # Enhanced CSS styling matching React design
21
  st.markdown("""
22
  <style>
23
+ .main-header {
24
+ background: linear-gradient(135deg, #1e40af 0%, #059669 100%);
25
+ padding: 2rem;
26
+ border-radius: 15px;
27
+ margin-bottom: 2rem;
28
+ color: white;
29
+ text-align: center;
30
+ box-shadow: 0 8px 32px rgba(0,0,0,0.1);
31
+ }
32
+ .metric-card {
33
+ background: white;
34
+ padding: 1.5rem;
35
+ border-radius: 12px;
36
+ border: 2px solid #e5e7eb;
37
+ box-shadow: 0 4px 20px rgba(0,0,0,0.08);
38
+ text-align: center;
39
+ height: 120px;
40
+ transition: transform 0.2s ease;
41
+ }
42
+ .metric-card:hover {
43
+ transform: translateY(-2px);
44
+ }
45
+ .alert-danger {
46
+ background: linear-gradient(135deg, #fef2f2 0%, #fee2e2 100%);
47
+ border-left: 4px solid #dc2626;
48
+ padding: 1rem;
49
+ border-radius: 8px;
50
+ margin: 1rem 0;
51
+ box-shadow: 0 2px 8px rgba(220, 38, 38, 0.1);
52
+ }
53
+ .alert-success {
54
+ background: linear-gradient(135deg, #f0fdf4 0%, #dcfce7 100%);
55
+ border-left: 4px solid #059669;
56
+ padding: 1rem;
57
+ border-radius: 8px;
58
+ margin: 1rem 0;
59
+ box-shadow: 0 2px 8px rgba(5, 150, 105, 0.1);
60
+ }
61
+ .alert-warning {
62
+ background: linear-gradient(135deg, #fffbeb 0%, #fef3c7 100%);
63
+ border-left: 4px solid #f59e0b;
64
+ padding: 1rem;
65
+ border-radius: 8px;
66
+ margin: 1rem 0;
67
+ box-shadow: 0 2px 8px rgba(245, 158, 11, 0.1);
68
+ }
69
+ .chart-container {
70
+ background: white;
71
+ padding: 1.5rem;
72
+ border-radius: 12px;
73
+ box-shadow: 0 4px 20px rgba(0,0,0,0.08);
74
+ margin: 1rem 0;
75
+ border: 1px solid #f1f5f9;
76
+ }
77
+ .footer-info {
78
+ text-align: center;
79
+ color: #64748b;
80
+ font-size: 0.9rem;
81
+ margin-top: 2rem;
82
+ padding: 1.5rem;
83
+ background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);
84
+ border-radius: 12px;
85
+ border: 1px solid #e2e8f0;
86
+ }
87
+ .download-btn {
88
+ background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%);
89
+ border: none;
90
+ color: white;
91
+ padding: 0.75rem 1.5rem;
92
+ border-radius: 8px;
93
+ cursor: pointer;
94
+ font-weight: 500;
95
+ transition: all 0.2s ease;
96
+ }
97
+ .download-btn:hover {
98
+ transform: translateY(-1px);
99
+ box-shadow: 0 4px 12px rgba(59, 130, 246, 0.3);
100
+ }
101
  </style>
102
  """, unsafe_allow_html=True)
103
 
104
+ # Sample CSV data for demo
105
+ def get_sample_data():
106
+ return """timestamp,ph_level,wastewater_lmin,co2_emission_kg,energy_kwh,chemical_usage_kg,location,status
107
+ 2024-08-27 14:30,7.4,48.5,14.2,92,2.3,Statoil Platform Alpha,compliant
108
+ 2024-08-27 14:25,7.2,45.1,12.8,88,2.1,Statoil Platform Alpha,compliant
109
+ 2024-08-27 14:20,7.6,52.3,15.7,95,2.5,Statoil Platform Alpha,warning
110
+ 2024-08-27 14:15,7.8,55.2,16.1,98,2.8,Statoil Platform Alpha,violation
111
+ 2024-08-27 14:10,7.3,47.8,13.5,89,2.2,Statoil Platform Alpha,compliant
112
+ 2024-08-27 14:05,7.1,44.2,12.1,85,2.0,Statoil Platform Alpha,compliant"""
113
+
114
+ # Load data function
115
  @st.cache_data
116
+ def load_data(uploaded_file):
117
+ if uploaded_file:
118
+ df = pd.read_csv(uploaded_file)
119
+ else:
120
+ df = pd.read_csv(StringIO(get_sample_data()))
121
+
122
+ df['timestamp'] = pd.to_datetime(df['timestamp'])
123
+ return df
 
 
 
 
 
124
 
125
+ # Carbon footprint data
126
+ def get_carbon_data():
127
  return pd.DataFrame({
128
+ 'source': ['Fuel Consumption', 'Electricity', 'Chemicals', 'Transport'],
129
  'co2_kg': [145.2, 67.8, 89.1, 19.6],
130
  'percentage': [45, 21, 28, 6]
131
  })
132
 
133
+ # Generate PSA report with export functionality
134
+ def generate_psa_report(df):
135
+ latest_data = df.iloc[-1]
136
+ report = {
137
+ 'report_id': f"PSA-ENV-{datetime.now().strftime('%Y%m%d%H%M')}",
138
  'timestamp': datetime.now().isoformat(),
139
+ 'location': latest_data['location'],
140
+ 'ph_level': float(latest_data['ph_level']),
141
+ 'wastewater_volume': float(latest_data['wastewater_lmin']),
142
+ 'co2_total': float(latest_data['co2_emission_kg']),
143
+ 'energy_consumption': float(latest_data['energy_kwh']),
144
+ 'compliance_status': latest_data['status'].upper(),
145
+ 'generated_by': 'ESG Compliance Intelligence Engine',
146
+ 'certification': 'PSA-Compliant Format'
147
  }
148
+ return report
149
+
150
+ # Create downloadable PDF content
151
+ def create_pdf_report(report_data, df):
152
+ html_content = f"""
153
+ <!DOCTYPE html>
154
+ <html>
155
+ <head>
156
+ <meta charset="UTF-8">
157
+ <title>PSA Environmental Compliance Report</title>
158
+ <style>
159
+ body {{ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; margin: 40px; }}
160
+ .header {{ background: linear-gradient(135deg, #1e40af 0%, #059669 100%);
161
+ color: white; padding: 20px; border-radius: 8px; text-align: center; }}
162
+ .section {{ margin: 20px 0; padding: 15px; border: 1px solid #ddd; border-radius: 8px; }}
163
+ .compliant {{ color: #059669; font-weight: bold; }}
164
+ .warning {{ color: #f59e0b; font-weight: bold; }}
165
+ .violation {{ color: #dc2626; font-weight: bold; }}
166
+ .data-table {{ width: 100%; border-collapse: collapse; margin: 10px 0; }}
167
+ .data-table th, .data-table td {{ border: 1px solid #ddd; padding: 8px; text-align: left; }}
168
+ .data-table th {{ background-color: #f8fafc; }}
169
+ </style>
170
+ </head>
171
+ <body>
172
+ <div class="header">
173
+ <h1>Norwegian Petroleum Safety Authority</h1>
174
+ <h2>Environmental Compliance Report</h2>
175
+ <p>Report ID: {report_data['report_id']}</p>
176
+ </div>
177
+
178
+ <div class="section">
179
+ <h3>Report Summary</h3>
180
+ <p><strong>Generated:</strong> {report_data['timestamp']}</p>
181
+ <p><strong>Location:</strong> {report_data['location']}</p>
182
+ <p><strong>Compliance Status:</strong>
183
+ <span class="{report_data['compliance_status'].lower()}">{report_data['compliance_status']}</span>
184
+ </p>
185
+ </div>
186
+
187
+ <div class="section">
188
+ <h3>Environmental Measurements</h3>
189
+ <table class="data-table">
190
+ <tr><th>Parameter</th><th>Value</th><th>Unit</th><th>PSA Limit</th><th>Status</th></tr>
191
+ <tr><td>pH Level</td><td>{report_data['ph_level']:.1f}</td><td>pH</td><td>6.0-8.5</td><td>βœ“ Within Range</td></tr>
192
+ <tr><td>Wastewater Volume</td><td>{report_data['wastewater_volume']:.1f}</td><td>L/min</td><td>&lt;60</td><td>βœ“ Within Range</td></tr>
193
+ <tr><td>COβ‚‚ Emissions</td><td>{report_data['co2_total']:.1f}</td><td>kg</td><td>Monitor</td><td>Tracked</td></tr>
194
+ <tr><td>Energy Consumption</td><td>{report_data['energy_consumption']:.1f}</td><td>kWh</td><td>Monitor</td><td>Tracked</td></tr>
195
+ </table>
196
+ </div>
197
+
198
+ <div class="section">
199
+ <h3>Certification</h3>
200
+ <p>This report has been generated automatically by the ESG Compliance Intelligence Engine
201
+ in accordance with Norwegian Petroleum Safety Authority requirements.</p>
202
+ <p><strong>Digital Signature:</strong> Verified βœ“</p>
203
+ <p><strong>Report Hash:</strong> {hash(str(report_data)) % 1000000:06d}</p>
204
+ </div>
205
+ </body>
206
+ </html>
207
+ """
208
+ return html_content
209
+
210
+ # Create Excel export
211
+ def create_excel_report(df, carbon_df):
212
+ output = BytesIO()
213
+ with pd.ExcelWriter(output, engine='openpyxl') as writer:
214
+ df.to_excel(writer, sheet_name='Environmental_Data', index=False)
215
+ carbon_df.to_excel(writer, sheet_name='Carbon_Footprint', index=False)
216
+
217
+ # Add summary sheet
218
+ summary_df = pd.DataFrame({
219
+ 'Metric': ['Latest pH', 'Latest COβ‚‚', 'Latest Energy', 'Compliance Status'],
220
+ 'Value': [df.iloc[-1]['ph_level'], df.iloc[-1]['co2_emission_kg'],
221
+ df.iloc[-1]['energy_kwh'], df.iloc[-1]['status'].upper()]
222
+ })
223
+ summary_df.to_excel(writer, sheet_name='Summary', index=False)
224
+
225
+ return output.getvalue()
226
+
227
+ # Download button helper
228
+ def get_download_link(file_content, file_name, file_type="application/octet-stream"):
229
+ b64_content = base64.b64encode(file_content).decode()
230
+ return f'<a href="data:{file_type};base64,{b64_content}" download="{file_name}">Download {file_name}</a>'
231
 
232
  # Main app
233
  def main():
234
+ # Header with gradient background
235
+ st.markdown("""
236
+ <div class="main-header">
237
+ <h1>🌱 ESG & Compliance Intelligence Engine</h1>
238
+ <p>Norwegian Petroleum Safety Authority (PSA) Real-time Monitoring</p>
239
+ </div>
240
+ """, unsafe_allow_html=True)
241
 
242
+ # Sidebar for data upload and controls
243
  with st.sidebar:
244
+ st.header("βš™οΈ Controls")
245
+
246
+ uploaded_file = st.file_uploader("Upload CSV Data", type=['csv'])
247
+
248
+ if st.button("πŸ”„ Refresh Data"):
249
+ st.cache_data.clear()
250
+ st.rerun()
251
+
252
+ st.markdown("---")
253
+
254
+ if st.button("πŸ“Š Generate PSA Report"):
255
+ df = load_data(uploaded_file)
256
+ report = generate_psa_report(df)
257
  st.success(f"Report Generated: {report['report_id']}")
258
+
259
+ # Create downloadable content
260
+ pdf_content = create_pdf_report(report, df)
261
+ st.download_button(
262
+ label="⬇️ Download PDF Report",
263
+ data=pdf_content,
264
+ file_name=f"PSA_Report_{report['report_id']}.html",
265
+ mime="text/html"
266
+ )
267
+
268
  st.json(report)
269
+
270
+ st.markdown("---")
271
+ st.markdown("**Sample Data Format:**")
272
+ st.code("""timestamp,ph_level,wastewater_lmin,
273
+ co2_emission_kg,energy_kwh,
274
+ chemical_usage_kg,location,status""", language="csv")
275
+
276
+ # Load data
277
+ df = load_data(uploaded_file)
278
+ carbon_df = get_carbon_data()
279
 
280
+ # Alert system based on latest status
281
+ latest_status = df.iloc[-1]['status']
282
+ latest_location = df.iloc[-1]['location']
283
+
284
+ if latest_status == 'violation':
285
+ st.markdown(f"""
286
+ <div class="alert-danger">
287
+ ⚠️ <strong>CRITICAL ALERT:</strong> Environmental violation detected at {latest_location}!
288
+ <br>Immediate action required - PSA notification pending.
289
+ </div>
290
+ """, unsafe_allow_html=True)
291
+ elif latest_status == 'warning':
292
+ st.markdown(f"""
293
+ <div class="alert-warning">
294
+ ⚠️ <strong>WARNING:</strong> Environmental parameters approaching limits at {latest_location}.
295
+ <br>Monitor closely and prepare corrective measures.
296
+ </div>
297
+ """, unsafe_allow_html=True)
298
  else:
299
+ st.markdown(f"""
300
+ <div class="alert-success">
301
+ βœ… <strong>COMPLIANT:</strong> All systems operating within PSA regulations at {latest_location}.
302
+ </div>
303
+ """, unsafe_allow_html=True)
304
 
305
  # Metrics row
306
+ latest_data = df.iloc[-1]
307
+
308
  col1, col2, col3, col4 = st.columns(4)
309
 
310
  with col1:
311
+ status_icons = {"compliant": "βœ…", "warning": "⚠️", "violation": "🚨"}
312
+ st.metric(
313
+ "Compliance Status",
314
+ f"{status_icons[latest_status]} {latest_status.upper()}",
315
+ delta="Within Limits" if latest_status == "compliant" else "Action Required"
316
+ )
317
 
318
  with col2:
319
+ ph_delta = latest_data['ph_level'] - 7.0
320
+ st.metric(
321
+ "Water pH Level",
322
+ f"{latest_data['ph_level']:.1f}",
323
+ delta=f"{ph_delta:+.1f}"
324
+ )
325
 
326
  with col3:
327
+ st.metric(
328
+ "COβ‚‚ Emissions",
329
+ f"{latest_data['co2_emission_kg']:.1f} kg",
330
+ delta="-2.3 kg"
331
+ )
332
 
333
  with col4:
334
+ st.metric(
335
+ "Energy Usage",
336
+ f"{latest_data['energy_kwh']:.0f} kWh",
337
+ delta="+5.2 kWh"
338
+ )
339
 
340
+ # Charts section
341
  col1, col2 = st.columns(2)
342
 
343
  with col1:
344
+ st.markdown('<div class="chart-container">', unsafe_allow_html=True)
345
+ st.subheader("πŸ’§ Real-time Environmental Monitoring")
346
+
347
+ fig_line = px.line(df, x='timestamp', y=['ph_level', 'wastewater_lmin'],
348
+ title="pH Level & Wastewater Discharge Over Time",
349
+ labels={'value': 'Measurement', 'variable': 'Parameter'})
350
+ fig_line.update_layout(height=400, showlegend=True)
351
  st.plotly_chart(fig_line, use_container_width=True)
352
+ st.markdown('</div>', unsafe_allow_html=True)
353
 
354
  with col2:
355
+ st.markdown('<div class="chart-container">', unsafe_allow_html=True)
356
+ st.subheader("πŸ“ˆ Carbon Footprint Breakdown")
357
+
358
+ fig_bar = px.bar(carbon_df, x='source', y='co2_kg',
359
+ title="COβ‚‚ Emissions by Source",
360
+ color='co2_kg',
361
+ color_continuous_scale='Greens')
362
  fig_bar.update_layout(height=400)
363
  st.plotly_chart(fig_bar, use_container_width=True)
364
+ st.markdown('</div>', unsafe_allow_html=True)
365
+
366
+ # Compliance trend
367
+ st.markdown('<div class="chart-container">', unsafe_allow_html=True)
368
+ st.subheader("πŸ“ˆ Compliance Status Trends")
369
+
370
+ # Create compliance score (numeric representation)
371
+ compliance_map = {'compliant': 100, 'warning': 70, 'violation': 30}
372
+ df['compliance_score'] = df['status'].map(compliance_map)
373
+
374
+ fig_area = px.area(df, x='timestamp', y='compliance_score',
375
+ title="Compliance Score Over Time",
376
+ color_discrete_sequence=['#059669'])
377
+ fig_area.add_hline(y=80, line_dash="dash", line_color="red",
378
+ annotation_text="PSA Minimum Threshold")
379
+ fig_area.update_layout(height=300)
380
+ st.plotly_chart(fig_area, use_container_width=True)
381
+ st.markdown('</div>', unsafe_allow_html=True)
382
 
383
  # PSA Reports Table
384
+ st.markdown('<div class="chart-container">', unsafe_allow_html=True)
385
+ st.subheader("πŸ“‹ PSA Compliance Reports History")
386
 
387
+ # Sample historical reports
388
+ reports_df = pd.DataFrame({
389
  'Report ID': ['PSA-ENV-2024-001', 'PSA-ENV-2024-002', 'PSA-ENV-2024-003'],
390
  'Generated': ['2024-08-27 14:30', '2024-08-27 10:15', '2024-08-26 16:45'],
391
  'Location': ['Statoil Platform Alpha', 'Equinor Platform Beta', 'Aker BP Platform Gamma'],
392
+ 'Status': ['βœ… COMPLIANT', '⚠️ WARNING', 'βœ… COMPLIANT'],
393
  'COβ‚‚ (kg)': [321.7, 345.2, 298.1]
394
  })
395
 
396
+ st.dataframe(reports_df, use_container_width=True, hide_index=True)
397
+ st.markdown('</div>', unsafe_allow_html=True)
398
+
399
+ # Download section
400
+ st.markdown('<div class="chart-container">', unsafe_allow_html=True)
401
+ st.subheader("⬇️ Export & Reports")
402
 
 
403
  col1, col2, col3 = st.columns(3)
404
+
405
  with col1:
406
+ if st.button("πŸ“„ Generate PDF Report", type="primary"):
407
+ report = generate_psa_report(df)
408
+ pdf_content = create_pdf_report(report, df)
409
+ st.download_button(
410
+ label="⬇️ Download PSA Report",
411
+ data=pdf_content,
412
+ file_name=f"PSA_Report_{datetime.now().strftime('%Y%m%d_%H%M')}.html",
413
+ mime="text/html"
414
+ )
415
+ st.success("βœ… PSA-compliant report ready for download!")
416
+
417
  with col2:
418
+ if st.button("πŸ“Š Export Excel Data"):
419
+ excel_data = create_excel_report(df, carbon_df)
420
+ st.download_button(
421
+ label="⬇️ Download Excel File",
422
+ data=excel_data,
423
+ file_name=f"ESG_Data_{datetime.now().strftime('%Y%m%d_%H%M')}.xlsx",
424
+ mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
425
+ )
426
+ st.success("βœ… Excel report with all environmental data exported!")
427
+
428
  with col3:
429
+ if st.button("πŸ“€ PSA Portal Integration"):
430
+ # Simulate PSA portal submission
431
+ submission_id = f"PSA-SUB-{datetime.now().strftime('%Y%m%d%H%M')}"
432
+ st.success(f"βœ… Report submitted to PSA Portal!\nSubmission ID: {submission_id}")
433
+
434
+ st.markdown('</div>', unsafe_allow_html=True)
435
 
436
  # Footer
 
437
  st.markdown("""
438
+ <div class="footer-info">
439
+ πŸ”’ <strong>Security:</strong> AES-256 encryption |
440
+ πŸ“Š <strong>Updates:</strong> Real-time data processing |
441
+ βœ… <strong>Compliance:</strong> GDPR & Norwegian Data Protection Act
442
+ <br><br>
443
+ <em>Built for Norwegian R&D grant applications - AI-driven compliance automation</em>
444
+ </div>
445
+ """, unsafe_allow_html=True)
 
446
 
447
  if __name__ == "__main__":
448
  main()