From f202042ef813b86d4fa033b0df4a2fc029117e7f Mon Sep 17 00:00:00 2001 From: Akshayak8 Date: Wed, 10 Sep 2025 19:19:12 +0530 Subject: [PATCH] new --- Images/osconnect.png | Bin 36782 -> 0 bytes backend/AAPL_history.csv | 22 ------ backend/app.py | 139 ++--------------------------------- backend/requirements.txt | 64 ++++++++-------- src/components/StockList.jsx | 6 +- 5 files changed, 39 insertions(+), 192 deletions(-) delete mode 100644 Images/osconnect.png delete mode 100644 backend/AAPL_history.csv diff --git a/Images/osconnect.png b/Images/osconnect.png deleted file mode 100644 index 9d16a0681a83f6094d60b197f358df638c50b7a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36782 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 apE=ZXtC1z^@-@H$l)=;0&t;ucLK6TBT^6JO diff --git a/backend/AAPL_history.csv b/backend/AAPL_history.csv deleted file mode 100644 index 29d36715fb..0000000000 --- a/backend/AAPL_history.csv +++ /dev/null @@ -1,22 +0,0 @@ -Date,Open,High,Low,Close,Volume -2025-06-26 00:00:00-04:00,201.43,202.64,199.46,201.0,50799100 -2025-06-27 00:00:00-04:00,201.89,203.22,200.0,201.08,73188600 -2025-06-30 00:00:00-04:00,202.01,207.39,199.26,205.17,91912800 -2025-07-01 00:00:00-04:00,206.67,210.19,206.14,207.82,78788900 -2025-07-02 00:00:00-04:00,208.91,213.34,208.14,212.44,67941800 -2025-07-03 00:00:00-04:00,212.15,214.65,211.81,213.55,34955800 -2025-07-07 00:00:00-04:00,212.68,216.23,208.8,209.95,50229000 -2025-07-08 00:00:00-04:00,210.1,211.43,208.45,210.01,42848900 -2025-07-09 00:00:00-04:00,209.53,211.33,207.22,211.14,48749400 -2025-07-10 00:00:00-04:00,210.51,213.48,210.03,212.41,44443600 -2025-07-11 00:00:00-04:00,210.57,212.13,209.86,211.16,39765800 -2025-07-14 00:00:00-04:00,209.93,210.91,207.54,208.62,38840100 -2025-07-15 00:00:00-04:00,209.22,211.89,208.92,209.11,42296300 -2025-07-16 00:00:00-04:00,210.3,212.4,208.64,210.16,47490500 -2025-07-17 00:00:00-04:00,210.57,211.8,209.59,210.02,48068100 -2025-07-18 00:00:00-04:00,210.87,211.79,209.7,211.18,48974600 -2025-07-21 00:00:00-04:00,212.1,215.78,211.63,212.48,51377400 -2025-07-22 00:00:00-04:00,213.14,214.95,212.23,214.4,46404100 -2025-07-23 00:00:00-04:00,215.0,215.15,212.41,214.15,46989300 -2025-07-24 00:00:00-04:00,213.9,215.69,213.53,213.76,46022600 -2025-07-25 00:00:00-04:00,214.7,215.24,213.4,213.88,40219700 diff --git a/backend/app.py b/backend/app.py index 30f5a9d2ea..97d914986c 100644 --- a/backend/app.py +++ b/backend/app.py @@ -1,152 +1,23 @@ -from flask import Flask, jsonify, request, send_file -from io import BytesIO -import yfinance as yf -import pandas as pd -import numpy as np -import plotly.express as px +from flask import Flask from flask_cors import CORS -import json -import traceback -import plotly -import requests -from tensorflow.keras.models import load_model -from sklearn.preprocessing import MinMaxScaler -from datetime import datetime, timedelta -from sklearn.linear_model import LinearRegression import os from routes.stock_routes import stock_routes from dotenv import load_dotenv +# Load env load_dotenv() app = Flask(__name__) CORS(app, resources={r"/*": {"origins": ["http://localhost:3000", "https://aistockanalyzer.onrender.com"]}}) +# Home route: @app.route('/') def home(): return "Welcome to the Stock Analysis API" - -@app.route('/api/export/history', methods=['GET']) -def export_stock_history(): - ticker = request.args.get('ticker') - period = request.args.get('period', '1mo') - filetype = request.args.get('type', 'csv') - - if not ticker: - return jsonify({'error': 'Ticker is required'}), 400 - - data = fetch_stock_data(ticker, period) - if isinstance(data, str): - return jsonify({'error': data}), 500 - - data = clean_stock_data(data) - - file_io = BytesIO() - if filetype == 'excel': - data.to_excel(file_io, index=False, engine='openpyxl') - mimetype = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' - ext = 'xlsx' - else: - data.to_csv(file_io, index=False) - mimetype = 'text/csv' - ext = 'csv' - - file_io.seek(0) - return send_file(file_io, mimetype=mimetype, as_attachment=True, download_name=f"{ticker}_history.{ext}") - - -@app.route('/api/export/prediction', methods=['GET']) -def export_predictions(): - ticker = request.args.get('ticker') - if not ticker: - return jsonify({'error': 'Ticker is required'}), 400 - - try: - data = yf.download(ticker, period='5y') - if data.empty: - return jsonify({'error': 'No data found'}), 404 - - data['Date'] = data.index - data['Date'] = data['Date'].map(datetime.toordinal) - X = data['Date'].values.reshape(-1, 1) - y = data['Close'].values.flatten() - - model = LinearRegression() - model.fit(X, y) - - future_dates = [datetime.now() + timedelta(days=i*365) for i in range(1, 11)] - predictions = model.predict(np.array([d.toordinal() for d in future_dates]).reshape(-1, 1)) - - df_pred = pd.DataFrame({ - 'Date': [d.strftime('%Y-%m-%d') for d in future_dates], - 'Predicted Price': [round(float(p), 2) for p in predictions] - }) - - file_io = BytesIO() - filetype = request.args.get('type', 'csv') - if filetype == 'excel': - df_pred.to_excel(file_io, index=False, engine='openpyxl') - mimetype = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' - ext = 'xlsx' - else: - df_pred.to_csv(file_io, index=False) - mimetype = 'text/csv' - ext = 'csv' - - file_io.seek(0) - return send_file(file_io, mimetype=mimetype, as_attachment=True, download_name=f"{ticker}_prediction.{ext}") - - except Exception as e: - return jsonify({'error': str(e)}), 500 - - -@app.route('/api/stock/predict', methods=['GET', 'OPTIONS']) -def predict_stock(): - ticker = request.args.get('ticker') - if not ticker: - return jsonify({'error': 'Ticker symbol is required'}), 400 - - try: - data = yf.download(ticker, period='5y') - if data.empty: - return jsonify({'error': 'No data found for the given ticker'}), 404 - - data['Date'] = data.index - data['Date'] = data['Date'].map(datetime.toordinal) - X = data['Date'].values.reshape(-1, 1) - y = data['Close'].values.flatten() - - model = LinearRegression() - model.fit(X, y) - - future_dates = [datetime.now() + timedelta(days=i*365) for i in range(1, 11)] - predictions = model.predict(np.array([d.toordinal() for d in future_dates]).reshape(-1, 1)) - - stocks = [10, 20, 50, 100] - returns = [] - current_price = float(y[-1]) - - for stock in stocks: - returns.append({ - 'stocks_bought': stock, - 'current_price': round(current_price * stock, 2), - 'after_1_year': round(float(predictions[0]) * stock, 0), - 'after_5_years': round(float(predictions[4]) * stock, 0), - 'after_10_years': round(float(predictions[9]) * stock, 0) - }) - - return jsonify({ - "future_predictions": [round(float(p), 2) for p in predictions], - "returns": returns - }) - - except Exception as e: - return jsonify({'error': str(e)}), 500 - - +# Register blueprint app.register_blueprint(stock_routes, url_prefix="/api") if __name__ == '__main__': port = int(os.environ.get('PORT', 10000)) - app.run(host='0.0.0.0', port=port) + app.run(host='0.0.0.0', port=port) \ No newline at end of file diff --git a/backend/requirements.txt b/backend/requirements.txt index 3716add441..7d94b90e4f 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,43 +1,41 @@ -Flask==3.1.1 -flask-cors==6.0.1 -gunicorn==23.0.0 -python-dotenv -numpy==2.3.2 -pandas==2.3.1 -scikit-learn==1.7.1 -scipy==1.16.1 -tensorflow==2.17.0 -joblib==1.5.1 -threadpoolctl==3.6.0 -yfinance==0.2.65 -requests==2.32.4 beautifulsoup4==4.13.4 -textblob -plotly==6.2.0 -openpyxl -frozendict==2.4.6 -typing_extensions==4.14.1 -packaging==25.0 +blinker==1.9.0 certifi==2025.8.3 +cffi==1.17.1 charset-normalizer==3.4.2 +click==8.2.1 +curl_cffi==0.12.0 +dotenv +Flask==3.1.1 +flask-cors==6.0.1 +frozendict==2.4.6 idna==3.10 -urllib3==2.5.0 -pytz==2025.2 -tzdata==2025.2 +itsdangerous==2.2.0 +Jinja2==3.1.6 +joblib==1.5.1 +MarkupSafe==3.0.2 multitasking==0.0.12 narwhals==2.0.1 +numpy==2.3.2 +packaging==25.0 +pandas==2.3.1 peewee==3.18.2 platformdirs==4.3.8 -blinker==1.9.0 -click==8.2.1 -itsdangerous==2.2.0 -Jinja2==3.1.6 -MarkupSafe==3.0.2 -Werkzeug==3.1.3 -redis>=5.0.0 -websockets==15.0.1 -soupsieve==2.7 -curl_cffi==0.12.0 +plotly==6.2.0 protobuf==6.31.1 pycparser==2.22 -six==1.17.0 \ No newline at end of file +python-dateutil==2.9.0.post0 +pytz==2025.2 +requests==2.32.4 +scikit-learn==1.7.1 +scipy==1.16.1 +six==1.17.0 +soupsieve==2.7 +threadpoolctl==3.6.0 +typing_extensions==4.14.1 +tzdata==2025.2 +urllib3==2.5.0 +websockets==15.0.1 +Werkzeug==3.1.3 +yfinance==0.2.65 +textblob \ No newline at end of file diff --git a/src/components/StockList.jsx b/src/components/StockList.jsx index 5098466e7a..a68355a208 100644 --- a/src/components/StockList.jsx +++ b/src/components/StockList.jsx @@ -7,7 +7,7 @@ import { auth } from "./firebase"; import stockData from "./data/stockData.json"; import BackToTopBtn from "./BackToTopBtn"; import styles from "./StockList.module.css"; -import stockBg2 from "../Images/stock2.png"; +import stockBg2 from "./images/bg.png"; const StocksList = () => { const [stocks, setStocks] = useState([]); @@ -54,13 +54,13 @@ const StocksList = () => { animate={{ opacity: 1 }} > {/* 🚀 Hero Section */} -

Welcome to Stock Analyzer!