From a7cc7b8e07cfeff6979b05910e091b5da60de9f6 Mon Sep 17 00:00:00 2001 From: sivanathan vithurshan Date: Sat, 10 May 2025 10:43:37 +0530 Subject: [PATCH 1/2] final branch --- .../_components/model-metadata.tsx | 2 +- .../_components/stock-dashboard.tsx | 135 +++++++++++++----- .../_components/stock-data-table.tsx | 5 +- .../_components/stock-prediction-chart.tsx | 12 +- src/lib/types/stock_prediction.ts | 6 +- 5 files changed, 109 insertions(+), 51 deletions(-) diff --git a/src/app/(dashboard)/dashboard/stockmarketprediction/_components/model-metadata.tsx b/src/app/(dashboard)/dashboard/stockmarketprediction/_components/model-metadata.tsx index c997af2..9ec9861 100644 --- a/src/app/(dashboard)/dashboard/stockmarketprediction/_components/model-metadata.tsx +++ b/src/app/(dashboard)/dashboard/stockmarketprediction/_components/model-metadata.tsx @@ -38,7 +38,7 @@ export default function ModelMetadata({ metadata }: ModelMetadataProps) {

Training Data Points

- {/*

{metadata.trainingDataPoints.toLocaleString()}

*/} +

{metadata.trainingDataPoints.toLocaleString()}

Features Used

diff --git a/src/app/(dashboard)/dashboard/stockmarketprediction/_components/stock-dashboard.tsx b/src/app/(dashboard)/dashboard/stockmarketprediction/_components/stock-dashboard.tsx index 67c239b..b8d2a41 100644 --- a/src/app/(dashboard)/dashboard/stockmarketprediction/_components/stock-dashboard.tsx +++ b/src/app/(dashboard)/dashboard/stockmarketprediction/_components/stock-dashboard.tsx @@ -15,6 +15,7 @@ import StockDataTable from "./stock-data-table" import ModelMetadata from "./model-metadata" //import {getStockData, getPredictionData, getModelMetadata} from "@/lib/data" import {exportToCSV} from "@/lib/export" +import {BACKEND_BASE_URL} from "@/lib/const" import {PredictionData, StockData, ModelMetadataType} from "@/lib/types/stock_prediction"; // import { number } from "zod" @@ -32,13 +33,13 @@ const formatDate = (date: Date) => { return date.toLocaleDateString("en-CA"); // "YYYY-MM-DD" format }; -const BASE_URL = process.env.NEXT_PUBLIC_BACKEND_BASE_URL || "http://localhost:8000"; +const BASE_URL = BACKEND_BASE_URL export default function StockDashboard() { const [selectedCompany, setSelectedCompany] = useState("") const [dateRange, setDateRange] = useState({ - from: new Date(new Date().setDate(new Date().getDate() - 30)), - to: new Date(), + from: new Date(new Date().setDate(new Date().getDate() - 31)), + to: new Date(new Date().setDate(new Date().getDate() - 1)), }) const [stockData, setStockData] = useState(null) const [predictionData, setPredictionData] = useState(null) @@ -46,6 +47,9 @@ export default function StockDashboard() { const [activeTab, setActiveTab] = useState("overview") const [sevchange, setSevchange] = useState(null) const [isLoading, setIsLoading] = useState(false); + const [isPredicting,setPredicting] = useState(false); + const [error,setError] = useState(null); + const [dataerror,setDataerror] = useState(null); const [companies, setCompanies] = useState([]); @@ -53,12 +57,22 @@ export default function StockDashboard() { useEffect(() => { const fetchCompanies = async () => { try { + setIsLoading(true); + console.log(`${BASE_URL}/get-active-symbols`) const response = await fetch(`${BASE_URL}/get-active-symbols`); - const data = await response.json(); - setCompanies(data.symbols); - setSelectedCompany(data.symbols[0].value); - } catch (error) { - console.error("Error fetching company symbols:", error); + if(response.ok){ + const data = await response.json(); + setCompanies(data.symbols); + setSelectedCompany(data.symbols[0].value); + // if(companies.length == 0){ + // setError("No active symbols") + // } + }else{ + setError("cannot get stock symbols") + } + setIsLoading(false) + } catch { + setError("Error fetching company symbols"); } }; @@ -70,7 +84,7 @@ export default function StockDashboard() { // Fetch stock data based on selected company and date range const fetchStockData = async () => { - setIsLoading(true); // Show loading popup + setPredicting(true); // Show loading popup try { const response = await fetch(`${BASE_URL}/V2/get-predicted-prices`, { method: "POST", @@ -83,20 +97,29 @@ export default function StockDashboard() { ticker_symbol: selectedCompany, }), }); - const data = await response.json(); - setStockData(data.stockData); - setModelMetadata(data.modelMetadata); - setPredictionData(data.predictionData) - if (data.predictionData && data.stockData && data.stockData.history.length > 0 && data.predictionData.predictions.length > 0) { - const lastPrediction = data.predictionData.predictions[data.predictionData.predictions.length - 1].predicted; - const lastPrice = data.stockData.history[data.stockData.history.length - 1].price; - const percentageChange = ((lastPrediction - lastPrice) / lastPrice) * 100; - setSevchange(percentageChange); + if(response.ok){ + const data = await response.json(); + setStockData(data.stockData); + setModelMetadata(data.modelMetadata); + setPredictionData(data.predictionData) + if (data.predictionData && data.stockData && data.stockData.history.length > 0 && data.predictionData.predictions.length > 0) { + const lastPrediction = data.predictionData.predictions[data.predictionData.predictions.length - 1].predicted; + const lastPrice = data.stockData.history[data.stockData.history.length - 1].price; + const percentageChange = ((lastPrediction - lastPrice) / lastPrice) * 100; + setSevchange(percentageChange); + } + } - } catch (error) { - console.error("Error fetching stock data:", error); + else{ + const result = await response.json(); + setDataerror(result.detail || "Resource not found"); + return; + } + + } catch { + console.error("Error fetching stock data"); } finally { - setIsLoading(false); // Hide loading popup + setPredicting(false); // Hide loading popup } }; @@ -114,20 +137,47 @@ export default function StockDashboard() { const handleExport = () => { exportToCSV(predictionData, `${selectedCompany}_predictions`) } + if(error){ + return ( +
- return ( -
- {isLoading && ( -
-
-
-

Loading...

+
+

{error}

+ +
+ ) + + } + if (isLoading) { + return ( +
+ +
+
+

Loading History...

+
+ +
+ ) + } + else if (isPredicting) { + return ( +
+ +
+
+

Predicting stock close prices...

- )} + +
+ ) + } + else { + return ( +

Stock Prediction Dashboard

@@ -159,8 +209,15 @@ export default function StockDashboard() {
+ {dataerror && (
+ +
+

{dataerror}

+
-
+
)} + + {!dataerror && (
@@ -205,16 +262,16 @@ export default function StockDashboard() {
${predictionData?.nextWeek.predicted.toFixed(2)}
- {/*

+

Confidence: {predictionData?.nextWeek.confidenceLow.toFixed(2)} -{" "} {predictionData?.nextWeek.confidenceHigh.toFixed(2)} -

*/} +

-
+
)} - + {!dataerror && ( Overview Predictions @@ -275,7 +332,7 @@ export default function StockDashboard() { {modelMetadata && } - + )}
) -} +}} diff --git a/src/app/(dashboard)/dashboard/stockmarketprediction/_components/stock-data-table.tsx b/src/app/(dashboard)/dashboard/stockmarketprediction/_components/stock-data-table.tsx index e490e7e..b5d6d49 100644 --- a/src/app/(dashboard)/dashboard/stockmarketprediction/_components/stock-data-table.tsx +++ b/src/app/(dashboard)/dashboard/stockmarketprediction/_components/stock-data-table.tsx @@ -17,6 +17,7 @@ export default function StockDataTable({data}: StockDataTableProps) { Date Predicted Price + Confidence Interval Change @@ -25,9 +26,9 @@ export default function StockDataTable({data}: StockDataTableProps) { {format(new Date(item.date), "MMM dd, yyyy")} ${item.predicted.toFixed(2)} - {/* + ${item.confidenceLow.toFixed(2)} - ${item.confidenceHigh.toFixed(2)} - */} + 0 ? "success" : "destructive"}> {item.change > 0 ? "+" : ""} diff --git a/src/app/(dashboard)/dashboard/stockmarketprediction/_components/stock-prediction-chart.tsx b/src/app/(dashboard)/dashboard/stockmarketprediction/_components/stock-prediction-chart.tsx index 503a022..bacb8af 100644 --- a/src/app/(dashboard)/dashboard/stockmarketprediction/_components/stock-prediction-chart.tsx +++ b/src/app/(dashboard)/dashboard/stockmarketprediction/_components/stock-prediction-chart.tsx @@ -15,8 +15,8 @@ interface ChartDataItem { formattedDate: string price: number | null predicted: number | null - // confidenceLow: number | null - // confidenceHigh: number | null + confidenceLow: number | null + confidenceHigh: number | null } export default function StockPredictionChart({historicalData, predictionData}: StockPredictionChartProps) { @@ -28,8 +28,8 @@ export default function StockPredictionChart({historicalData, predictionData}: S ...item, formattedDate: format(new Date(item.date), "MMM dd"), predicted: null, - // confidenceLow: null, - // confidenceHigh: null, + confidenceLow: null, + confidenceHigh: null, })) const predictions = predictionData.map((item) => ({ @@ -37,8 +37,8 @@ export default function StockPredictionChart({historicalData, predictionData}: S formattedDate: format(new Date(item.date), "MMM dd"), price: null, // No actual price for future dates predicted: item.predicted, - // confidenceLow: item.confidenceLow, - // confidenceHigh: item.confidenceHigh, + confidenceLow: item.confidenceLow, + confidenceHigh: item.confidenceHigh, })) // Combine the data sets diff --git a/src/lib/types/stock_prediction.ts b/src/lib/types/stock_prediction.ts index 71066da..cdd8c9f 100644 --- a/src/lib/types/stock_prediction.ts +++ b/src/lib/types/stock_prediction.ts @@ -19,8 +19,8 @@ export interface StockData { export interface PredictionItem { date: string; predicted: number; - // confidenceLow: number; - // confidenceHigh: number; + confidenceLow: number; + confidenceHigh: number; change: number; } @@ -39,5 +39,5 @@ export interface ModelMetadataType { maeScore: number; // features: string[]; lastUpdated: string; - // trainingDataPoints: number; + trainingDataPoints: number; } \ No newline at end of file From bea604a86450541bfb51b9d0fc230ff3d7564e50 Mon Sep 17 00:00:00 2001 From: sivanathan vithurshan Date: Sat, 10 May 2025 10:56:39 +0530 Subject: [PATCH 2/2] final --- .../stockmarketprediction/_components/model-metadata.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/(dashboard)/dashboard/stockmarketprediction/_components/model-metadata.tsx b/src/app/(dashboard)/dashboard/stockmarketprediction/_components/model-metadata.tsx index 9ec9861..a3f1ef3 100644 --- a/src/app/(dashboard)/dashboard/stockmarketprediction/_components/model-metadata.tsx +++ b/src/app/(dashboard)/dashboard/stockmarketprediction/_components/model-metadata.tsx @@ -41,7 +41,7 @@ export default function ModelMetadata({ metadata }: ModelMetadataProps) {

{metadata.trainingDataPoints.toLocaleString()}

-

Features Used

+ {/*

Features Used

*/} {/*
{metadata.features.map((feature, index) => (
@@ -68,7 +68,7 @@ export default function ModelMetadata({ metadata }: ModelMetadataProps) {

Mean Absolute Error (MAE)

-

${metadata.maeScore.toFixed(2)}

+

{metadata.maeScore.toFixed(5)}

Average error in price predictions