Skip to content

Commit d592b25

Browse files
Update app.py
1 parent 9d21ef6 commit d592b25

File tree

1 file changed

+83
-67
lines changed

1 file changed

+83
-67
lines changed

backend/app.py

Lines changed: 83 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,19 @@
22
import io
33
import pandas as pd
44
import matplotlib
5-
matplotlib.use('Agg') # <- forces a non-GUI backend
5+
matplotlib.use('Agg')
66
import 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
88
from sklearn.linear_model import LinearRegression
99
import numpy as np
1010
import openai
1111
import sys
1212
from datetime import datetime
1313
from flask_cors import CORS
1414

15-
app = Flask(__name__, static_folder="static", template_folder="../frontend")
15+
app = Flask(__name__, static_folder="static")
1616
CORS(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+
2018
UPLOAD_FOLDER = "uploads"
2119
STATIC_FOLDER = "static"
2220
os.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"])
9398
def 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" })
135152
if __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

Comments
 (0)