# utils/export.py (new file) import csv import json import base64 from io import BytesIO, StringIO def export_to_csv(explanation_data, filename="attributions.csv"): """Export explanation data to CSV""" output = StringIO() writer = csv.writer(output) if explanation_data and isinstance(explanation_data[0], dict): # SHAP/Captum format writer.writerow(['Token', 'Value', 'Position']) for item in explanation_data: writer.writerow([item.get('token', ''), item.get('value', 0), item.get('position', 0)]) else: # LIME format writer.writerow(['Feature', 'Weight']) for feature, weight in explanation_data: writer.writerow([feature, weight]) csv_string = output.getvalue() output.close() # Create downloadable link b64 = base64.b64encode(csv_string.encode()).decode() return f'Download CSV' def export_to_json(explanation_data, filename="attributions.json"): """Export explanation data to JSON""" json_string = json.dumps(explanation_data, indent=2) b64 = base64.b64encode(json_string.encode()).decode() return f'Download JSON' def export_plot_as_png(plot_html, filename="attribution_plot.png"): """Extract PNG from plot HTML and create download link""" try: # Extract base64 data from HTML import re match = re.search(r'base64,([^"]+)', plot_html) if match: b64_data = match.group(1) return f'Download PNG' return "Download not available" except Exception as e: print(f"Export error: {e}") return "Download failed"