Commit
·
d5a1ba3
1
Parent(s):
1974ab3
show graph
Browse files
app.py
CHANGED
|
@@ -238,34 +238,30 @@ def safe_get_column(df, column):
|
|
| 238 |
# If still not found, raise a helpful error
|
| 239 |
raise KeyError(f"Column '{column}' not found in DataFrame. Available columns: {list(df.columns)}")
|
| 240 |
|
| 241 |
-
def
|
| 242 |
-
import os
|
| 243 |
-
import matplotlib
|
| 244 |
-
|
| 245 |
-
# Make sure we're using the non-interactive backend
|
| 246 |
-
matplotlib.use('Agg')
|
| 247 |
-
|
| 248 |
-
if filename is None:
|
| 249 |
-
filename = PLOT_FILENAME
|
| 250 |
-
|
| 251 |
-
# Convert to absolute path
|
| 252 |
-
filename = os.path.abspath(str(filename))
|
| 253 |
-
|
| 254 |
-
# Ensure the directory exists
|
| 255 |
-
os.makedirs(os.path.dirname(filename) or '.', exist_ok=True)
|
| 256 |
-
|
| 257 |
try:
|
| 258 |
-
#
|
| 259 |
-
|
| 260 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 261 |
|
| 262 |
-
# Save
|
| 263 |
-
|
|
|
|
| 264 |
plt.close()
|
| 265 |
-
|
| 266 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 267 |
except Exception as e:
|
| 268 |
-
print(f"[ERROR] Failed to
|
| 269 |
return None
|
| 270 |
|
| 271 |
# Monkey patch DataFrame to add safe column access
|
|
@@ -287,16 +283,16 @@ pd.DataFrame.safe_get = safe_get_column
|
|
| 287 |
script_content = script_content.replace("['Close']", ".safe_get('close')")
|
| 288 |
script_content = script_content.replace("['close']", ".safe_get('close')")
|
| 289 |
|
| 290 |
-
# Replace plt.
|
| 291 |
script_content = re.sub(
|
| 292 |
-
r'plt
|
| 293 |
-
r'
|
| 294 |
script_content
|
| 295 |
)
|
| 296 |
|
| 297 |
-
# If no
|
| 298 |
-
if 'plt.
|
| 299 |
-
script_content += "\n#
|
| 300 |
|
| 301 |
# Write the updated script back
|
| 302 |
with open(temp_script_path, 'w') as f:
|
|
|
|
| 238 |
# If still not found, raise a helpful error
|
| 239 |
raise KeyError(f"Column '{column}' not found in DataFrame. Available columns: {list(df.columns)}")
|
| 240 |
|
| 241 |
+
def show_plot(plt):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 242 |
try:
|
| 243 |
+
# Use a non-interactive backend to avoid GUI issues
|
| 244 |
+
import matplotlib
|
| 245 |
+
matplotlib.use('Agg')
|
| 246 |
+
|
| 247 |
+
# Create a temporary file to store the plot
|
| 248 |
+
import io
|
| 249 |
+
import base64
|
| 250 |
|
| 251 |
+
# Save plot to a bytes buffer
|
| 252 |
+
buf = io.BytesIO()
|
| 253 |
+
plt.savefig(buf, format='png', bbox_inches='tight', dpi=100)
|
| 254 |
plt.close()
|
| 255 |
+
|
| 256 |
+
# Convert to base64 for display
|
| 257 |
+
buf.seek(0)
|
| 258 |
+
img_str = base64.b64encode(buf.read()).decode('utf-8')
|
| 259 |
+
buf.close()
|
| 260 |
+
|
| 261 |
+
# Return HTML to display the image
|
| 262 |
+
return f'<img src="data:image/png;base64,{img_str}" />'
|
| 263 |
except Exception as e:
|
| 264 |
+
print(f"[ERROR] Failed to display plot: {str(e)}")
|
| 265 |
return None
|
| 266 |
|
| 267 |
# Monkey patch DataFrame to add safe column access
|
|
|
|
| 283 |
script_content = script_content.replace("['Close']", ".safe_get('close')")
|
| 284 |
script_content = script_content.replace("['close']", ".safe_get('close')")
|
| 285 |
|
| 286 |
+
# Replace plt.show() calls with our helper
|
| 287 |
script_content = re.sub(
|
| 288 |
+
r'plt\\.show\\(\s*\\)',
|
| 289 |
+
r'print(show_plot(plt))',
|
| 290 |
script_content
|
| 291 |
)
|
| 292 |
|
| 293 |
+
# If no show() call is found, add one at the end of the script
|
| 294 |
+
if 'plt.show()' not in script_content:
|
| 295 |
+
script_content += "\n# Display the plot if any figures exist\nif 'plt' in locals() and len(plt.get_fignums()) > 0:\n print(show_plot(plt))\n"
|
| 296 |
|
| 297 |
# Write the updated script back
|
| 298 |
with open(temp_script_path, 'w') as f:
|