22import io
33import pandas as pd
44import matplotlib
5- matplotlib .use ('Agg' ) # <- forces a non-GUI backend
5+ matplotlib .use ('Agg' )
66import matplotlib .pyplot as plt
7- from flask import Flask , request , jsonify , send_file , redirect , url_for , render_template
7+ from flask import Flask , request , jsonify
88from sklearn .linear_model import LinearRegression
99import numpy as np
1010import openai
1111import sys
1212from datetime import datetime
1313from flask_cors import CORS
1414
15- app = Flask (__name__ , static_folder = "static" , template_folder = "../frontend" )
15+ app = Flask (__name__ , static_folder = "static" )
1616CORS (app , resources = {r"/*" : {"origins" : "https://hariprashad-ravikumar.github.io" }})
17- @app .route ("/" )
18- def home ():
19- return render_template ("index.html" , summary = "" , log = "" , forecast = "" , plot_url = None )
17+
2018UPLOAD_FOLDER = "uploads"
2119STATIC_FOLDER = "static"
2220os .makedirs (UPLOAD_FOLDER , exist_ok = True )
@@ -33,20 +31,19 @@ def upload_file():
3331 log_stream .truncate (0 )
3432 log_stream .seek (0 )
3533
36- file = request .files ["file" ]
34+ file = request .files .get ("file" )
35+ if file is None :
36+ return jsonify ({"error" : "No file uploaded" }), 400
37+
3738 filepath = os .path .join (UPLOAD_FOLDER , file .filename )
3839 file .save (filepath )
39-
4040 log_print ("📦 File uploaded:" , file .filename )
4141
42- # Load and clean
43- log_print ("🔧 Importing pandas..." )
4442 df = pd .read_csv (filepath )
4543 df .dropna (inplace = True )
4644 df .columns = ['X' , 'Y' ]
4745 log_print ("🔍 Cleaned Data:" , df .head ())
4846
49- # Plot
5047 plt .figure ()
5148 plt .scatter (df ['X' ], df ['Y' ])
5249 plt .xlabel ('X' )
@@ -56,82 +53,101 @@ def upload_file():
5653 plt .close ()
5754 log_print ("📊 Scatter plot saved." )
5855
59- # Model
60- log_print ("⚙️ Converting X (dates) to numeric format..." )
6156 df ['X' ] = pd .to_datetime (df ['X' ], errors = 'coerce' )
6257 df .dropna (inplace = True )
6358 X = df ['X' ].map (pd .Timestamp .toordinal ).values .reshape (- 1 , 1 )
6459 y = df ['Y' ].values
6560
6661 if len (X ) == 0 :
6762 log_print ("❌ No valid data to fit the model." )
68- return render_template ("index.html" , summary = "No valid data found." , log = log_stream .getvalue (), forecast = "N/A" , plot_url = None )
63+ return jsonify ({
64+ "summary" : "No valid data found." ,
65+ "log" : log_stream .getvalue (),
66+ "forecast" : "N/A" ,
67+ "plot_url" : None
68+ })
6969
7070 model = LinearRegression ()
7171 model .fit (X , y )
7272 log_print ("🤖 Model trained." )
7373
74- # OpenAI Summary
75- openai .api_key = os .getenv ("OPENAI_API_KEY" )
76- client = openai .OpenAI (api_key = os .getenv ("OPENAI_API_KEY" ))
77-
78- response = client .chat .completions .create (
79- model = "gpt-3.5-turbo" ,
80- messages = [
81- {"role" : "system" , "content" : "Summarize this dataset:" },
82- {"role" : "user" , "content" : df .head (10 ).to_csv ()}
83- ]
84- )
85-
86- summary = response .choices [0 ].message .content
87-
88- log_print ("🧠 OpenAI Summary generated." )
89- return jsonify ({"summary" : summary , "log" : log_stream .getvalue (), "forecast" : "Submit future x-values below to get predictions." , "plot_url" : "/static/plot.png" })
90-
74+ try :
75+ openai .api_key = os .getenv ("OPENAI_API_KEY" )
76+ client = openai .OpenAI (api_key = openai .api_key )
77+ response = client .chat .completions .create (
78+ model = "gpt-3.5-turbo" ,
79+ messages = [
80+ {"role" : "system" , "content" : "Summarize this dataset:" },
81+ {"role" : "user" , "content" : df .head (10 ).to_csv ()}
82+ ]
83+ )
84+ summary = response .choices [0 ].message .content
85+ log_print ("🧠 OpenAI Summary generated." )
86+ except Exception as e :
87+ summary = "OpenAI summarization failed."
88+ log_print ("❌ OpenAI error:" , str (e ))
89+
90+ return jsonify ({
91+ "summary" : summary ,
92+ "log" : log_stream .getvalue (),
93+ "forecast" : "Submit future x-values below to get predictions." ,
94+ "plot_url" : "/static/plot.png"
95+ })
9196
9297@app .route ("/predict" , methods = ["POST" ])
9398def predict ():
9499 future_x = request .form .get ("future_x" )
100+ if not future_x :
101+ return jsonify ({
102+ "forecast" : "No future values provided." ,
103+ "log" : log_stream .getvalue (),
104+ "plot_url" : None
105+ })
95106
96107 try :
97- # Convert input strings to ordinal integers
98- values = [
99- datetime .strptime (x .strip (), "%Y-%m-%d" ).toordinal ()
100- for x in future_x .split ("," )
101- ]
108+ values = [datetime .strptime (x .strip (), "%Y-%m-%d" ).toordinal ()
109+ for x in future_x .split ("," )]
102110 except ValueError :
103111 log_print ("❌ Invalid date format. Use YYYY-MM-DD." )
104- return render_template (
105- "index.html" ,
106- summary = "" ,
107- log = log_stream .getvalue (),
108- forecast = "Invalid date format. Use YYYY-MM-DD." ,
109- plot_url = None
110- )
112+ return jsonify ({
113+ "forecast" : "Invalid date format. Use YYYY-MM-DD." ,
114+ "log" : log_stream .getvalue (),
115+ "plot_url" : None
116+ })
111117
112- # Reload most recent uploaded file
113- filename = os .listdir (UPLOAD_FOLDER )[0 ]
114- df = pd .read_csv (os .path .join (UPLOAD_FOLDER , filename ))
115- df .dropna (inplace = True )
116- df .columns = ['X' , 'Y' ]
117- df ['X' ] = pd .to_datetime (df ['X' ], errors = 'coerce' )
118- df .dropna (inplace = True )
119-
120- X = df ['X' ].map (pd .Timestamp .toordinal ).values .reshape (- 1 , 1 )
121- y = df ['Y' ].values
122-
123- model = LinearRegression ()
124- model .fit (X , y )
125-
126- predicted = model .predict (np .array (values ).reshape (- 1 , 1 ))
127- result = {
128- datetime .fromordinal (v ).strftime ("%Y-%m-%d" ): round (p , 2 )
129- for v , p in zip (values , predicted )
130- }
131-
132- log_print ("🔮 Forecast complete." )
118+ try :
119+ filename = os .listdir (UPLOAD_FOLDER )[0 ]
120+ df = pd .read_csv (os .path .join (UPLOAD_FOLDER , filename ))
121+ df .dropna (inplace = True )
122+ df .columns = ['X' , 'Y' ]
123+ df ['X' ] = pd .to_datetime (df ['X' ], errors = 'coerce' )
124+ df .dropna (inplace = True )
125+ X = df ['X' ].map (pd .Timestamp .toordinal ).values .reshape (- 1 , 1 )
126+ y = df ['Y' ].values
127+
128+ model = LinearRegression ()
129+ model .fit (X , y )
130+
131+ predicted = model .predict (np .array (values ).reshape (- 1 , 1 ))
132+ result = {
133+ datetime .fromordinal (v ).strftime ("%Y-%m-%d" ): round (p , 2 )
134+ for v , p in zip (values , predicted )
135+ }
136+
137+ log_print ("🔮 Forecast complete." )
138+ return jsonify ({
139+ "forecast" : result ,
140+ "log" : log_stream .getvalue (),
141+ "plot_url" : "/static/plot.png"
142+ })
143+
144+ except Exception as e :
145+ log_print ("❌ Prediction failed:" , str (e ))
146+ return jsonify ({
147+ "forecast" : "Prediction failed." ,
148+ "log" : log_stream .getvalue (),
149+ "plot_url" : None
150+ })
133151
134- return jsonify ({ "forecast" : result , "log" : log_stream .getvalue (), "plot_url" : "/static/plot.png" })
135152if __name__ == "__main__" :
136- app .run (host = "0.0.0.0" , port = 80 , debug = True )
137-
153+ app .run (host = "0.0.0.0" , port = 80 )
0 commit comments