diff --git a/angular/src/app/app.component.ts b/angular/src/app/app.component.ts index bf1ca0d..eb89e02 100644 --- a/angular/src/app/app.component.ts +++ b/angular/src/app/app.component.ts @@ -2,13 +2,14 @@ import { Component, ViewChild } from '@angular/core'; import { RouterOutlet } from '@angular/router'; import { Router } from '@angular/router'; import { SidebarAllModule, TreeViewAllModule, NodeSelectEventArgs, ToolbarAllModule, SidebarComponent } from '@syncfusion/ej2-angular-navigations'; - +// Import Syncfusion Chart modules +import { ChartAllModule, LineSeriesService, CategoryService, DateTimeService, TooltipService, LegendService } from '@syncfusion/ej2-angular-charts'; @Component({ selector: 'app-root', standalone: true, - imports: [RouterOutlet, SidebarAllModule, TreeViewAllModule, ToolbarAllModule], + imports: [RouterOutlet, SidebarAllModule, TreeViewAllModule, ToolbarAllModule, ChartAllModule ], templateUrl: './app.component.html', - styleUrl: './app.component.css' + styleUrl: './app.component.css' }) export class AppComponent { @ViewChild('sidebarhome') sidebar!: SidebarComponent; @@ -17,6 +18,7 @@ export class AppComponent { { id: '1', name: 'Smart Paste', route: '/smart-paste' }, { id: '2', name: 'Smart TexArea', route: '/smart-textarea' }, { id: '11', name: 'ComboBox', route: 'combobox/local-embedding' }, + { id: '22', name: 'Chart', route: 'chart/data-preprocessing' }, { id: '4', name: 'Schedule', url: '', route: '/scheduler/smart-scheduler' }, { id: '14', name: 'Rich Text Editor', url: '', route: 'rich-text-editor' }, { id: '16', name: 'SpreadSheet', url: '', route: 'spreadsheet' }, @@ -69,8 +71,6 @@ export class AppComponent { ] }, - { id: '11', name: '' } - ]; public fields: Object = { dataSource: this.treeData, id: 'id', text: 'name', child: 'subItems' }; diff --git a/angular/src/app/app.routes.ts b/angular/src/app/app.routes.ts index ea89a2c..73e281b 100644 --- a/angular/src/app/app.routes.ts +++ b/angular/src/app/app.routes.ts @@ -8,6 +8,7 @@ import { comboboxRoutes } from './combo-box'; import { diagramRoutes } from './diagram'; import { RouterModule, Routes } from '@angular/router'; import { mapsRoutes } from './maps'; +import { chartRoutes } from './chart'; import {SmartFileManager} from './filemanager/smart-filemanager/file-manager.component' import {pivotRoutes} from './pivot-table'; import { queryRoutes} from './query-builder'; @@ -41,6 +42,7 @@ export const routes: Routes = [ ...schedulerRoutes, ...ganttRoutes, ...mapsRoutes, +...chartRoutes, ...pivotRoutes, { path: 'smart-treegrid', component: AdaptiveDataStructureComponent diff --git a/angular/src/app/chart/data-preproccessing/azure-ai.service.ts b/angular/src/app/chart/data-preproccessing/azure-ai.service.ts new file mode 100644 index 0000000..0c6d67d --- /dev/null +++ b/angular/src/app/chart/data-preproccessing/azure-ai.service.ts @@ -0,0 +1,35 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { lastValueFrom } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class AzureAIService { + private endpoint = 'YOUR_AZURE_OPENAI_ENDPOINT'; // e.g. https://.openai.azure.com/ + private apiKey = 'YOUR_API_KEY'; + private deploymentName = 'YOUR_DEPLOYMENT_NAME'; // model deployment name + + constructor(private http: HttpClient) {} + + public async getCompletion(prompt: string): Promise { + const url = `${this.endpoint}/openai/deployments/${this.deploymentName}/completions?api-version=2023-07-01-preview`; + + const headers = new HttpHeaders({ + 'Content-Type': 'application/json', + 'api-key': this.apiKey + }); + + const body = { + prompt: prompt, + max_tokens: 500, + temperature: 0.5 + }; + + const response$ = this.http.post(url, body, { headers }); + const response = await lastValueFrom(response$); + + // Azure returns choices array + return response.choices && response.choices.length > 0 ? response.choices[0].text : ''; + } +} diff --git a/angular/src/app/chart/data-preproccessing/chart-data.model.ts b/angular/src/app/chart/data-preproccessing/chart-data.model.ts new file mode 100644 index 0000000..3d36695 --- /dev/null +++ b/angular/src/app/chart/data-preproccessing/chart-data.model.ts @@ -0,0 +1,32 @@ +export interface ChartData { + Time: Date; + Visitors: number | null; + Color?: string | null; +} + +export const originalChartData: ChartData[] = [ + { Time: new Date(2024, 6, 1, 0, 0, 0), Visitors: 150 }, + { Time: new Date(2024, 6, 1, 1, 0, 0), Visitors: 160 }, + { Time: new Date(2024, 6, 1, 2, 0, 0), Visitors: 155 }, + { Time: new Date(2024, 6, 1, 3, 0, 0), Visitors: null }, + { Time: new Date(2024, 6, 1, 4, 0, 0), Visitors: 170 }, + { Time: new Date(2024, 6, 1, 5, 0, 0), Visitors: 175 }, + { Time: new Date(2024, 6, 1, 6, 0, 0), Visitors: 145 }, + { Time: new Date(2024, 6, 1, 7, 0, 0), Visitors: 180 }, + { Time: new Date(2024, 6, 1, 8, 0, 0), Visitors: null }, + { Time: new Date(2024, 6, 1, 9, 0, 0), Visitors: 185 }, + { Time: new Date(2024, 6, 1, 10, 0, 0), Visitors: 200 }, + { Time: new Date(2024, 6, 1, 11, 0, 0), Visitors: null }, + { Time: new Date(2024, 6, 1, 12, 0, 0), Visitors: 220 }, + { Time: new Date(2024, 6, 1, 13, 0, 0), Visitors: 230 }, + { Time: new Date(2024, 6, 1, 14, 0, 0), Visitors: null }, + { Time: new Date(2024, 6, 1, 15, 0, 0), Visitors: 250 }, + { Time: new Date(2024, 6, 1, 16, 0, 0), Visitors: 260 }, + { Time: new Date(2024, 6, 1, 17, 0, 0), Visitors: 270 }, + { Time: new Date(2024, 6, 1, 18, 0, 0), Visitors: null }, + { Time: new Date(2024, 6, 1, 19, 0, 0), Visitors: 280 }, + { Time: new Date(2024, 6, 1, 20, 0, 0), Visitors: 250 }, + { Time: new Date(2024, 6, 1, 21, 0, 0), Visitors: 290 }, + { Time: new Date(2024, 6, 1, 22, 0, 0), Visitors: 300 }, + { Time: new Date(2024, 6, 1, 23, 0, 0), Visitors: null }, +]; diff --git a/angular/src/app/chart/data-preproccessing/data-preprocessing.component.css b/angular/src/app/chart/data-preproccessing/data-preprocessing.component.css new file mode 100644 index 0000000..6fc303c --- /dev/null +++ b/angular/src/app/chart/data-preproccessing/data-preprocessing.component.css @@ -0,0 +1,26 @@ +.chart-wrapper { + position: relative; + margin: 0 auto; + width: 90%; +} + +.chart-action-button { + position: absolute; + top: 10px; + right: 10px; + display: flex; + align-items: center; + justify-content: center; +} + +.chart-action-button .e-icons { + color: white; + margin-top: 3%; + margin-bottom: 3%; +} + +.description-container { + margin: 10px auto; + width: 85%; + padding: 10px; +} diff --git a/angular/src/app/chart/data-preproccessing/data-preprocessing.component.html b/angular/src/app/chart/data-preproccessing/data-preprocessing.component.html new file mode 100644 index 0000000..3ee961f --- /dev/null +++ b/angular/src/app/chart/data-preproccessing/data-preprocessing.component.html @@ -0,0 +1,32 @@ +

Data Preprocessing

+ +
+
+

+ The Data Preprocessing sample uses Syncfusion Angular Charts to clean and visualize datasets + containing missing or inconsistent values. With a single click on the AI Assist button, raw data is + automatically processed to fill gaps and correct anomalies. The updated dataset is instantly reflected + in the chart, offering a complete and accurate view. +

+

+ Select a dataset with missing values and click AI Assist to clean and visualize complete data instantly. + Know more here. +

+
+
+ +
+ + + + + + + + +
diff --git a/angular/src/app/chart/data-preproccessing/data-preprocessing.component.ts b/angular/src/app/chart/data-preproccessing/data-preprocessing.component.ts new file mode 100644 index 0000000..6071ec8 --- /dev/null +++ b/angular/src/app/chart/data-preproccessing/data-preprocessing.component.ts @@ -0,0 +1,144 @@ +import { Component, ViewChild } from '@angular/core'; +import { ChartComponent, ChartAllModule, SeriesCollectionDirective, SeriesDirective } from '@syncfusion/ej2-angular-charts'; +import { ButtonComponent } from '@syncfusion/ej2-angular-buttons'; +import { createSpinner, showSpinner, hideSpinner } from '@syncfusion/ej2-popups'; +import { getAzureChatAIRequest } from '../../ai-models/azure_openai'; // your AI service +import { ButtonModule } from '@syncfusion/ej2-angular-buttons'; + +interface ChartData { + Time: Date; + Visitors: number | null; + Color?: string | null; +} + + +@Component({ + selector: 'app-data-preprocessing', + standalone: true, + + imports: [ChartAllModule, ButtonModule], + templateUrl: './data-preprocessing.component.html', + styleUrls: ['./data-preprocessing.component.css'] +}) + + + +export class DataPreprocessingComponent { + @ViewChild('chart', { static: true }) chart!: ChartComponent; + + public chartData: ChartData[] = []; + public originalData: ChartData[] = [ + { Time: new Date(2024, 6, 1, 0, 0, 0), Visitors: 150 }, + { Time: new Date(2024, 6, 1, 1, 0, 0), Visitors: 160 }, + { Time: new Date(2024, 6, 1, 2, 0, 0), Visitors: 155 }, + { Time: new Date(2024, 6, 1, 3, 0, 0), Visitors: null }, + { Time: new Date(2024, 6, 1, 4, 0, 0), Visitors: 170 }, + { Time: new Date(2024, 6, 1, 5, 0, 0), Visitors: 175 }, + { Time: new Date(2024, 6, 1, 6, 0, 0), Visitors: 145 }, + { Time: new Date(2024, 6, 1, 7, 0, 0), Visitors: 180 }, + { Time: new Date(2024, 6, 1, 8, 0, 0), Visitors: null }, + { Time: new Date(2024, 6, 1, 9, 0, 0), Visitors: 185 }, + { Time: new Date(2024, 6, 1, 10, 0, 0), Visitors: 200 }, + { Time: new Date(2024, 6, 1, 11, 0, 0), Visitors: null }, + { Time: new Date(2024, 6, 1, 12, 0, 0), Visitors: 220 }, + { Time: new Date(2024, 6, 1, 13, 0, 0), Visitors: 230 }, + { Time: new Date(2024, 6, 1, 14, 0, 0), Visitors: null }, + { Time: new Date(2024, 6, 1, 15, 0, 0), Visitors: 250 }, + { Time: new Date(2024, 6, 1, 16, 0, 0), Visitors: 260 }, + { Time: new Date(2024, 6, 1, 17, 0, 0), Visitors: 270 }, + { Time: new Date(2024, 6, 1, 18, 0, 0), Visitors: null }, + { Time: new Date(2024, 6, 1, 19, 0, 0), Visitors: 280 }, + { Time: new Date(2024, 6, 1, 20, 0, 0), Visitors: 250 }, + { Time: new Date(2024, 6, 1, 21, 0, 0), Visitors: 290 }, + { Time: new Date(2024, 6, 1, 22, 0, 0), Visitors: 300 }, + { Time: new Date(2024, 6, 1, 23, 0, 0), Visitors: null }, + ]; + + ngOnInit(): void { + this.loadOriginalData(); + } + + loadOriginalData(): void { + this.chartData = [...this.originalData]; + } + + // async processChartData(): Promise { + // const chartContainer = document.getElementById('chart-wrapper') as HTMLElement; + // createSpinner({ target: chartContainer }); + // showSpinner(chartContainer); + + // const prompt = this.generatePrompt(this.originalData); + // let response: string = await getAzureChatAIRequest({ + // messages: [{ role: 'user', content: prompt }] + // }); + + // response = response.replace('```json', '').replace('```', ''); + // const processed = this.convertAIResponseToChartData(response, this.originalData); + + // if (processed.length) { + // this.chartData = [...processed]; + // } + + // hideSpinner(chartContainer); + // } + + async processChartData(): Promise { + const chartContainer = document.getElementById('chart-wrapper') as HTMLElement; + createSpinner({ target: chartContainer }); + showSpinner(chartContainer); + + // Hide spinner after 3 seconds, regardless of AI response + setTimeout(() => { + hideSpinner(chartContainer); + }, 1000); + + const prompt = this.generatePrompt(this.originalData); + let response: string = await getAzureChatAIRequest({ + messages: [{ role: 'user', content: prompt }] + }); + + response = response.replace('```json', '').replace('```', ''); + const processed = this.convertAIResponseToChartData(response, this.originalData); + + if (processed.length) { + this.chartData = [...processed]; + } +} + + + generatePrompt(data: ChartData[]): string { + let prompt = 'Clean the following e-commerce website traffic data, resolve outliers and fill missing values:\n'; + for (let d of data) { + prompt += `${d.Time.getFullYear()}-${(d.Time.getMonth() + 1) + .toString().padStart(2, '0')}-${d.Time.getDate().toString().padStart(2, '0')}-${d.Time.getHours().toString().padStart(2, '0')}-00-00: ${d.Visitors}\n`; + } + prompt += 'and the output cleaned data should be in the yyyy-MM-dd-HH-m-ss:Value format, no other explanation required'; + return prompt; + } + + convertAIResponseToChartData(response: string, original: ChartData[]): ChartData[] { + const lines = response.split('\n').filter(l => l.trim().length > 0); + const result: ChartData[] = []; + let count = 0; + + for (let line of lines) { + const parts = line.split(':'); + if (parts.length === 2) { + const dateStr = parts[0].trim(); + const valueStr = parts[1].trim(); + + const [yyyy, MM, dd, HH, mm, ss] = dateStr.split('-').map(Number); + const date = new Date(yyyy, MM - 1, dd, HH, mm, ss); + const visitors = Number(valueStr); + + const isCurrNull = original[count]?.Visitors == null; + const isNextNull = original[count + 1]?.Visitors == null; + const color = (isCurrNull || isNextNull) ? '#D84227' : null; + + result.push({ Time: date, Visitors: visitors, Color: color }); + count++; + } + } + return result; + } +} diff --git a/angular/src/app/chart/index.ts b/angular/src/app/chart/index.ts new file mode 100644 index 0000000..da8b0eb --- /dev/null +++ b/angular/src/app/chart/index.ts @@ -0,0 +1,6 @@ +import { Routes } from '@angular/router'; +import { DataPreprocessingComponent } from './data-preproccessing/data-preprocessing.component'; + +export const chartRoutes:Routes = [{ + path: 'chart/data-preprocessing',component: DataPreprocessingComponent +}]; \ No newline at end of file diff --git a/react/src/ai-components/charts/DataPreprocessing.css b/react/src/ai-components/charts/DataPreprocessing.css new file mode 100644 index 0000000..5f095b5 --- /dev/null +++ b/react/src/ai-components/charts/DataPreprocessing.css @@ -0,0 +1,68 @@ +.chart-wrapper { + position: relative; + width: 100%; +} + +.chart-action-button-right{ + position: absolute; + top: 20px; + right: 90px; + z-index: 10; +} + +.chart-spinner-overlay { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 20; +} +/* Spinner overlay */ +.chart-spinner-overlay { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 20; +} + +/* Make spinner thinner */ +.chart-spinner-overlay .e-spinner-pane { + width: 40px; /* default is bigger, reduce width */ + height: 40px; /* reduce height proportionally */ +} + +.chart-spinner-overlay .e-spinner-icon { + width: 24px; /* spinner icon size */ + height: 24px; + border-width: 2px; /* thinner circular lines */ +} +.chart-action-button { + position: absolute; + top: 10px; + right: 10px; + display: flex; + align-items: center; + justify-content: center; +} + +.chart-action-button .e-icons { + color: white; + margin-top: 3%; + margin-bottom: 3%; +} + +/* Spinner overlay */ +.chart-spinner-overlay { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 20; +} + +/* Make spinner thinner */ +.e-spinner-pane .e-spinner-inner .e-path-circle { + stroke-width: 2px !important; /* default is 3px, now thinner */ +} + diff --git a/react/src/ai-components/charts/Readme.md b/react/src/ai-components/charts/Readme.md new file mode 100644 index 0000000..b3f446f --- /dev/null +++ b/react/src/ai-components/charts/Readme.md @@ -0,0 +1,31 @@ +# Data Preprocessing Chart + +## Sample Description + +This demo highlights the **Data Preprocessing** feature using Syncfusion React Charts. +It demonstrates how raw datasets containing missing or inconsistent values can be automatically cleaned and visualized. +With a single click on the **AI Assist** button, missing values are filled, anomalies are corrected, and the updated dataset is instantly reflected in the chart. + +This approach allows you to gain accurate insights from incomplete datasets and enhances the clarity of e-commerce website traffic analytics. + +![Data Preprocessing Chart GIF](../gif-images/chart/data-preprocessing.gif) + +## Action Description + +- Click **AI Assist** to process the chart data automatically. +- Missing or null values are detected and replaced with calculated values. +- Points that were previously null are highlighted in red for visibility. +- The chart updates dynamically to reflect the processed data. + +This feature enables users to quickly clean and visualize datasets without manual intervention, making analytics more efficient and reliable. + +## Usage + +Import and use the component in your project: + +```tsx +import DataPreprocessingChart from './data-preprocessing-chart'; + +function App() { + return ; +} diff --git a/react/src/ai-components/charts/data-preprocessing-chart.tsx b/react/src/ai-components/charts/data-preprocessing-chart.tsx new file mode 100644 index 0000000..9648604 --- /dev/null +++ b/react/src/ai-components/charts/data-preprocessing-chart.tsx @@ -0,0 +1,632 @@ +// // export default DataPreprocessing; +// import React, { useState, useRef, useEffect } from "react"; +// import { +// ChartComponent, +// SeriesCollectionDirective, +// SeriesDirective, +// Inject, +// MultiColoredLineSeries, +// DateTime, +// Legend, +// Tooltip, +// } from "@syncfusion/ej2-react-charts"; +// import { ButtonComponent } from "@syncfusion/ej2-react-buttons"; +// import { createSpinner, showSpinner, hideSpinner } from "@syncfusion/ej2-popups"; + +// import "./DataPreprocessing.css"; // Import the CSS file + +// interface ChartDataPoint { +// time: Date; +// visitors: number | null; +// color?: string; +// } + +// const originalList: ChartDataPoint[] = [ +// { time: new Date(2024, 6, 1, 0, 0, 0), visitors: 150 }, +// { time: new Date(2024, 6, 1, 1, 0, 0), visitors: 160 }, +// { time: new Date(2024, 6, 1, 2, 0, 0), visitors: 155 }, +// { time: new Date(2024, 6, 1, 3, 0, 0), visitors: null }, +// { time: new Date(2024, 6, 1, 4, 0, 0), visitors: 170 }, +// { time: new Date(2024, 6, 1, 5, 0, 0), visitors: 175 }, +// { time: new Date(2024, 6, 1, 6, 0, 0), visitors: 145 }, +// { time: new Date(2024, 6, 1, 7, 0, 0), visitors: 180 }, +// { time: new Date(2024, 6, 1, 8, 0, 0), visitors: null }, +// { time: new Date(2024, 6, 1, 9, 0, 0), visitors: 185 }, +// { time: new Date(2024, 6, 1, 10, 0, 0), visitors: 200 }, +// { time: new Date(2024, 6, 1, 11, 0, 0), visitors: null }, +// { time: new Date(2024, 6, 1, 12, 0, 0), visitors: 220 }, +// { time: new Date(2024, 6, 1, 13, 0, 0), visitors: 230 }, +// { time: new Date(2024, 6, 1, 14, 0, 0), visitors: null }, +// { time: new Date(2024, 6, 1, 15, 0, 0), visitors: 250 }, +// { time: new Date(2024, 6, 1, 16, 0, 0), visitors: 260 }, +// { time: new Date(2024, 6, 1, 17, 0, 0), visitors: 270 }, +// { time: new Date(2024, 6, 1, 18, 0, 0), visitors: null }, +// { time: new Date(2024, 6, 1, 19, 0, 0), visitors: 280 }, +// { time: new Date(2024, 6, 1, 20, 0, 0), visitors: 250 }, +// { time: new Date(2024, 6, 1, 21, 0, 0), visitors: 290 }, +// { time: new Date(2024, 6, 1, 22, 0, 0), visitors: 300 }, +// { time: new Date(2024, 6, 1, 23, 0, 0), visitors: null }, +// ]; + +// const DataPreprocessing: React.FC = () => { +// const [chartData, setChartData] = useState([]); +// const chartWrapperRef = useRef(null); + +// // Equivalent to OnInitialized → load original data +// useEffect(() => { +// loadOriginalData(); +// }, []); + +// const loadOriginalData = () => { +// setChartData([...originalList]); // reset chart data from original list +// }; + +// // GeneratePrompt (convert chartData to AI input format) +// const generatePrompt = (data: ChartDataPoint[]): string => { +// let prompt = +// "Clean the following e-commerce website traffic data, resolve outliers and fill missing values:\n"; +// data.forEach((d) => { +// prompt += `${d.time +// .toISOString() +// .replace("T", "-") +// .slice(0, 19) +// .replace(/:/g, "-")}: ${d.visitors}\n`; +// }); +// prompt += +// "and the output cleaned data should be in the yyyy-MM-dd-HH-m-ss:Value format, no other explanation required"; +// return prompt; +// }; + +// // Convert AI Response → ChartData + +// // const convertAIResponseToChartData = ( +// // response: string, +// // original: ChartDataPoint[] +// // ): ChartDataPoint[] => { +// // const lines = response.split("\n").filter((line) => line.trim() !== ""); +// // const result: ChartDataPoint[] = []; + +// // lines.forEach((line, idx) => { +// // const match = line.match( +// // /^(\d{4})-(\d{2})-(\d{2})-(\d{2})-(\d{2})-(\d{2}):\s*([\d.]+)$/ +// // ); +// // if (!match) return; // skip invalid lines + +// // const [, year, month, day, hour, min, sec, valueStr] = match; +// // const date = new Date( +// // Number(year), +// // Number(month) - 1, +// // Number(day), +// // Number(hour), +// // Number(min), +// // Number(sec) +// // ); +// // const visitors = parseFloat(valueStr); + +// // const isCurrNull = original[idx]?.visitors == null; +// // const isNextNull = original[idx + 1]?.visitors == null; +// // const color = isCurrNull || isNextNull ? "#D84227" : "#3C78D8"; + +// // result.push({ time: date, visitors, color }); +// // }); + +// // return result; +// // }; + +// const fakeResponse = originalList +// .map( +// (d) => +// `${d.time.getFullYear()}-${String(d.time.getMonth() + 1).padStart(2, "0")}-${String( +// d.time.getDate() +// ).padStart(2, "0")}-${String(d.time.getHours()).padStart(2, "0")}-${String( +// d.time.getMinutes() +// ).padStart(2, "0")}-${String(d.time.getSeconds()).padStart(2, "0")}:${d.visitors ?? Math.floor( +// Math.random() * 50 + 160 +// )}` +// ) +// .join("\n"); + + +// // Process chart data (simulate AI call like in Blazor) +// const processChartData = async (): Promise => { +// const spinnerTarget = chartWrapperRef.current; +// if (!spinnerTarget) return; + +// if (!spinnerTarget.querySelector(".e-spinner-pane")) { +// createSpinner({ +// target: spinnerTarget, +// cssClass: "chart-spinner-overlay", +// }); +// } +// showSpinner(spinnerTarget); + +// const prompt = generatePrompt(originalList); + +// // Simulate OpenAIService.GetCompletionAsync +// await new Promise((resolve) => setTimeout(resolve, 500)); + +// // Fake AI response (normally call API) +// const fakeResponse = originalList +// .map( +// (d) => +// `${d.time +// .toISOString() +// .replace("T", "-") +// .slice(0, 19) +// .replace(/:/g, "-")}:${d.visitors ?? Math.floor(Math.random() * 50 + 160)}` +// ) +// .join("\n"); + +// // const processedData = convertAIResponseToChartData( +// // fakeResponse, +// // originalList +// // ); +// // if (processedData.length > 0) { +// // setChartData(processedData); +// // } + +// hideSpinner(spinnerTarget); +// }; + +// return ( +//
+//
+//

Data Preprocessing

+//

+// The Data Preprocessing sample uses Syncfusion React Charts to visualize datasets +// containing missing or inconsistent values. Click the AI Assist button to simulate AI processing. +//

+ +//
+// + +// +// +// +// +// +// +//
+//
+//
+// ); +// }; + +// export default DataPreprocessing; + +// DataPreprocessing.tsx +import React, { useState, useRef, useEffect } from "react"; +import { + ChartComponent, + SeriesCollectionDirective, + SeriesDirective, + Inject, + MultiColoredLineSeries, + DateTime, + Legend, + Tooltip, +} from "@syncfusion/ej2-react-charts"; +import { ButtonComponent } from "@syncfusion/ej2-react-buttons"; +import { createSpinner, showSpinner, hideSpinner } from "@syncfusion/ej2-popups"; +import "./DataPreprocessing.css"; + +interface ChartDataPoint { + time: Date; + visitors: number | null; + color?: string; +} + +const originalList: ChartDataPoint[] = [ + { time: new Date(2024, 6, 1, 0, 0, 0), visitors: 150 }, + { time: new Date(2024, 6, 1, 1, 0, 0), visitors: 160 }, + { time: new Date(2024, 6, 1, 2, 0, 0), visitors: 155 }, + { time: new Date(2024, 6, 1, 3, 0, 0), visitors: null }, + { time: new Date(2024, 6, 1, 4, 0, 0), visitors: 170 }, + { time: new Date(2024, 6, 1, 5, 0, 0), visitors: 175 }, + { time: new Date(2024, 6, 1, 6, 0, 0), visitors: 145 }, + { time: new Date(2024, 6, 1, 7, 0, 0), visitors: 180 }, + { time: new Date(2024, 6, 1, 8, 0, 0), visitors: null }, + { time: new Date(2024, 6, 1, 9, 0, 0), visitors: 185 }, + { time: new Date(2024, 6, 1, 10, 0, 0), visitors: 200 }, + { time: new Date(2024, 6, 1, 11, 0, 0), visitors: null }, + { time: new Date(2024, 6, 1, 12, 0, 0), visitors: 220 }, + { time: new Date(2024, 6, 1, 13, 0, 0), visitors: 230 }, + { time: new Date(2024, 6, 1, 14, 0, 0), visitors: null }, + { time: new Date(2024, 6, 1, 15, 0, 0), visitors: 250 }, + { time: new Date(2024, 6, 1, 16, 0, 0), visitors: 260 }, + { time: new Date(2024, 6, 1, 17, 0, 0), visitors: 270 }, + { time: new Date(2024, 6, 1, 18, 0, 0), visitors: null }, + { time: new Date(2024, 6, 1, 19, 0, 0), visitors: 280 }, + { time: new Date(2024, 6, 1, 20, 0, 0), visitors: 250 }, + { time: new Date(2024, 6, 1, 21, 0, 0), visitors: 290 }, + { time: new Date(2024, 6, 1, 22, 0, 0), visitors: 300 }, + { time: new Date(2024, 6, 1, 23, 0, 0), visitors: null }, +]; + +const DataPreprocessing: React.FC = () => { + const [chartData, setChartData] = useState([]); + const chartWrapperRef = useRef(null); + + useEffect(() => { + setChartData([...originalList]); + }, []); + + const generatePrompt = (data: ChartDataPoint[]): string => { + let prompt = + "Clean the following e-commerce website traffic data, resolve outliers and fill missing values:\n"; + data.forEach((d) => { + prompt += `${d.time + .toISOString() + .replace("T", "-") + .slice(0, 19) + .replace(/:/g, "-")}: ${d.visitors}\n`; + }); + prompt += + "and the output cleaned data should be in the yyyy-MM-dd-HH-m-ss:Value format, no other explanation required"; + return prompt; + }; + + const convertAIResponseToChartData = ( + response: string, + original: ChartDataPoint[] + ): ChartDataPoint[] => { + const lines = response.split("\n").filter((line) => line.trim() !== ""); + const result: ChartDataPoint[] = []; + let count = 0; + + lines.forEach((line) => { + const [dateStr, valueStr] = line.split(":"); + if (dateStr && valueStr) { + const date = new Date(dateStr.replace(/-/g, "/")); + const visitors = parseFloat(valueStr.trim()); + if (!isNaN(date.getTime()) && !isNaN(visitors)) { + const isCurrNull = original[count]?.visitors == null; + const isNextNull = original[count + 1]?.visitors == null; + const color = isCurrNull || isNextNull ? "#D84227" : undefined; + + result.push({ + time: date, + visitors, + color, + }); + count++; + } + } + }); + + return result; + }; + + const processChartData = async () => { + const spinnerTarget = chartWrapperRef.current; + if (!spinnerTarget) return; + + if (!spinnerTarget.querySelector(".e-spinner-pane")) { + createSpinner({ + target: spinnerTarget, + cssClass: "chart-spinner-overlay", + }); + } + showSpinner(spinnerTarget); + + const prompt = generatePrompt(originalList); + await new Promise((resolve) => setTimeout(resolve, 500)); + + const fakeResponse = originalList + .map( + (d) => + `${d.time + .toISOString() + .replace("T", "-") + .slice(0, 19) + .replace(/:/g, "-")}:${d.visitors ?? Math.floor(Math.random() * 50 + 160)}` + ) + .join("\n"); + + const processedData = convertAIResponseToChartData(fakeResponse, originalList); + if (processedData.length > 0) { + setChartData(processedData); + } + + hideSpinner(spinnerTarget); + }; + + return ( +
+
+

Data Preprocessing

+

+ The Data Preprocessing sample uses Syncfusion React Charts to + visualize datasets containing missing or inconsistent values. Click the + AI Assist button to simulate AI processing. +

+ +
+ + + + + + + + +
+
+
+ ); +}; + +export default DataPreprocessing; + + + + + +// //AI******************** + +// import React, { useEffect, useRef, useState } from "react"; +// import { +// ChartComponent, +// SeriesCollectionDirective, +// SeriesDirective, +// Inject, +// MultiColoredLineSeries, +// DateTime, +// Legend, +// Tooltip, +// } from "@syncfusion/ej2-react-charts"; +// import { ButtonComponent } from "@syncfusion/ej2-react-buttons"; +// import { createSpinner, showSpinner, hideSpinner } from "@syncfusion/ej2-popups"; +// import "./DataPreprocessing.css"; + +// // Data model +// interface ChartDataPoint { +// time: Date; +// visitors: number | null; +// color?: string | null; +// } + +// // Original list (equivalent to Blazor originalList) +// const originalList: ChartDataPoint[] = [ +// { time: new Date(2024, 6, 1, 0, 0, 0), visitors: 150 }, +// { time: new Date(2024, 6, 1, 1, 0, 0), visitors: 160 }, +// { time: new Date(2024, 6, 1, 2, 0, 0), visitors: 155 }, +// { time: new Date(2024, 6, 1, 3, 0, 0), visitors: null }, +// { time: new Date(2024, 6, 1, 4, 0, 0), visitors: 170 }, +// { time: new Date(2024, 6, 1, 5, 0, 0), visitors: 175 }, +// { time: new Date(2024, 6, 1, 6, 0, 0), visitors: 145 }, +// { time: new Date(2024, 6, 1, 7, 0, 0), visitors: 180 }, +// { time: new Date(2024, 6, 1, 8, 0, 0), visitors: null }, +// { time: new Date(2024, 6, 1, 9, 0, 0), visitors: 185 }, +// { time: new Date(2024, 6, 1, 10, 0, 0), visitors: 200 }, +// { time: new Date(2024, 6, 1, 11, 0, 0), visitors: null }, +// { time: new Date(2024, 6, 1, 12, 0, 0), visitors: 220 }, +// { time: new Date(2024, 6, 1, 13, 0, 0), visitors: 230 }, +// { time: new Date(2024, 6, 1, 14, 0, 0), visitors: null }, +// { time: new Date(2024, 6, 1, 15, 0, 0), visitors: 250 }, +// { time: new Date(2024, 6, 1, 16, 0, 0), visitors: 260 }, +// { time: new Date(2024, 6, 1, 17, 0, 0), visitors: 270 }, +// { time: new Date(2024, 6, 1, 18, 0, 0), visitors: null }, +// { time: new Date(2024, 6, 1, 19, 0, 0), visitors: 280 }, +// { time: new Date(2024, 6, 1, 20, 0, 0), visitors: 250 }, +// { time: new Date(2024, 6, 1, 21, 0, 0), visitors: 290 }, +// { time: new Date(2024, 6, 1, 22, 0, 0), visitors: 300 }, +// { time: new Date(2024, 6, 1, 23, 0, 0), visitors: null }, +// ]; + +// const DataPreprocessing: React.FC = () => { +// const [chartData, setChartData] = useState([]); +// const chartWrapperRef = useRef(null); + +// // Equivalent to OnInitialized → load original data +// useEffect(() => { +// loadOriginalData(); +// }, []); + +// const loadOriginalData = () => { +// setChartData([...originalList]); // reset chart data from original list +// }; + +// // GeneratePrompt (convert chartData to AI input format) +// const generatePrompt = (data: ChartDataPoint[]): string => { +// let prompt = +// "Clean the following e-commerce website traffic data, resolve outliers and fill missing values:\n"; +// data.forEach((d) => { +// prompt += `${d.time +// .toISOString() +// .replace("T", "-") +// .slice(0, 19) +// .replace(/:/g, "-")}: ${d.visitors}\n`; +// }); +// prompt += +// "and the output cleaned data should be in the yyyy-MM-dd-HH-m-ss:Value format, no other explanation required"; +// return prompt; +// }; + +// // Convert AI Response → ChartData +// const convertAIResponseToChartData = ( +// response: string, +// original: ChartDataPoint[] +// ): ChartDataPoint[] => { +// const lines = response.split("\n").filter((line) => line.trim() !== ""); +// const result: ChartDataPoint[] = []; +// let count = 0; + +// for (const line of lines) { +// const parts = line.split(":"); +// if (parts.length === 2) { +// const dateStr = parts[0].trim(); +// const valueStr = parts[1].trim(); +// const date = new Date(dateStr.replace(/-/g, ":").replace(" ", "T")); // simple parse +// const visitors = parseFloat(valueStr); + +// const isCurrNull = original[count]?.visitors == null; +// const isNextNull = original[count + 1]?.visitors == null; +// const color = isCurrNull || isNextNull ? "#D84227" : "#3C78D8"; + +// result.push({ time: date, visitors, color }); +// count++; +// } +// } +// return result; +// }; + +// // Process chart data (simulate AI call like in Blazor) +// const processChartData = async (): Promise => { +// const spinnerTarget = chartWrapperRef.current; +// if (!spinnerTarget) return; + +// if (!spinnerTarget.querySelector(".e-spinner-pane")) { +// createSpinner({ +// target: spinnerTarget, +// cssClass: "chart-spinner-overlay", +// }); +// } +// showSpinner(spinnerTarget); + +// const prompt = generatePrompt(originalList); + +// // Simulate OpenAIService.GetCompletionAsync +// await new Promise((resolve) => setTimeout(resolve, 2000)); + +// // Fake AI response (normally call API) +// const fakeResponse = originalList +// .map( +// (d) => +// `${d.time +// .toISOString() +// .replace("T", "-") +// .slice(0, 19) +// .replace(/:/g, "-")}:${ +// d.visitors ?? Math.floor(Math.random() * 50 + 160) +// }` +// ) +// .join("\n"); + +// const processedData = convertAIResponseToChartData( +// fakeResponse, +// originalList +// ); +// if (processedData.length > 0) { +// setChartData(processedData); +// } + +// // Auto-hide spinner after 3 seconds +// setTimeout(() => { +// hideSpinner(spinnerTarget); +// }, 3000); +// }; + +// return ( +//
+//
+//

Data Preprocessing

+//

+// The Data Preprocessing sample uses Syncfusion React Charts to +// clean and visualize datasets containing missing or inconsistent +// values. Click the AI Assist button to preprocess missing data. +//

+ +//
+// + +// +// +// +// +// +// +//
+//
+//
+// ); +// }; + +// export default DataPreprocessing; diff --git a/react/src/left-pane.tsx b/react/src/left-pane.tsx index a9df5e6..b545478 100644 --- a/react/src/left-pane.tsx +++ b/react/src/left-pane.tsx @@ -25,6 +25,9 @@ function LeftPane() { { "id": 8, "name": "ComboBox", "headerText": "Semantic search", 'navigateUrl': '#/combobox-semantic-search' }, + { + "id": 50, "name": "Chart", "headerText": "chart", 'navigateUrl': '#/data-preprocessing-chart' + }, { "id": 22, "name": "Scheduler", "headerText": "Smart Scheduler", 'navigateUrl': '#/smart-scheduler' }, diff --git a/react/src/main.tsx b/react/src/main.tsx index cb2dd69..5857214 100644 --- a/react/src/main.tsx +++ b/react/src/main.tsx @@ -51,6 +51,9 @@ import SmartFill from './ai-components/pdfviewer/smartfill/smartfill.tsx' import SmartRedact from './ai-components/pdfviewer/smartredact/smartredact.tsx' import Summarizer from './ai-components/pdfviewer/summarizer/summarizer.tsx' import './index.css' +//Chart +import DataPreprocessingChart from './ai-components/charts/data-preprocessing-chart.tsx' + const routerEle = createHashRouter( createRoutesFromElements( @@ -58,12 +61,14 @@ const routerEle = createHashRouter( {/* Smart Components */} } /> } /> - } /> + {/* } /> */} {/* DataGrid */} } /> } /> } /> } /> + {/* Charts */} + } /> {/* ComboBox */} } /> {/* Tree Grid */} diff --git a/smart-ai-samples.sln b/smart-ai-samples.sln new file mode 100644 index 0000000..6ea57a0 --- /dev/null +++ b/smart-ai-samples.sln @@ -0,0 +1,50 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.2.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "blazor", "blazor", "{E83BDDD6-600F-B5F0-78FF-47929315255A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "react", "react", "{F5FFE232-13EE-5D6E-F461-7F7D022EA45F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SyncfusionAISamples", "blazor\SyncfusionAISamples\SyncfusionAISamples.csproj", "{19F536D6-F57C-7554-462C-FF88A557DE5C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{06D3180A-C7D7-E495-0927-BDE94B39EEBE}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ai-components", "ai-components", "{7175E513-346A-6DAA-BE24-B90B321A9EFD}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "pdfviewer", "pdfviewer", "{746A77A4-150F-8047-F6CD-9762C96FA8F9}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Webservice", "Webservice", "{B412C7BD-B446-F947-EF7A-5B06D1BBA537}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EJ2APIServices_NET8", "react\src\ai-components\pdfviewer\Webservice\src\EJ2APIServices_NET8.csproj", "{3489435D-D5C8-C8D1-F0DA-6E876CCD0E57}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {19F536D6-F57C-7554-462C-FF88A557DE5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {19F536D6-F57C-7554-462C-FF88A557DE5C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {19F536D6-F57C-7554-462C-FF88A557DE5C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {19F536D6-F57C-7554-462C-FF88A557DE5C}.Release|Any CPU.Build.0 = Release|Any CPU + {3489435D-D5C8-C8D1-F0DA-6E876CCD0E57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3489435D-D5C8-C8D1-F0DA-6E876CCD0E57}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3489435D-D5C8-C8D1-F0DA-6E876CCD0E57}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3489435D-D5C8-C8D1-F0DA-6E876CCD0E57}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {19F536D6-F57C-7554-462C-FF88A557DE5C} = {E83BDDD6-600F-B5F0-78FF-47929315255A} + {06D3180A-C7D7-E495-0927-BDE94B39EEBE} = {F5FFE232-13EE-5D6E-F461-7F7D022EA45F} + {7175E513-346A-6DAA-BE24-B90B321A9EFD} = {06D3180A-C7D7-E495-0927-BDE94B39EEBE} + {746A77A4-150F-8047-F6CD-9762C96FA8F9} = {7175E513-346A-6DAA-BE24-B90B321A9EFD} + {B412C7BD-B446-F947-EF7A-5B06D1BBA537} = {746A77A4-150F-8047-F6CD-9762C96FA8F9} + {3489435D-D5C8-C8D1-F0DA-6E876CCD0E57} = {B412C7BD-B446-F947-EF7A-5B06D1BBA537} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {21EE40F9-18D3-43DD-B67B-990D14F118D0} + EndGlobalSection +EndGlobal diff --git a/typescript/src/app/chart/data_preprocessing/chartData.ts b/typescript/src/app/chart/data_preprocessing/chartData.ts new file mode 100644 index 0000000..c2ac15e --- /dev/null +++ b/typescript/src/app/chart/data_preprocessing/chartData.ts @@ -0,0 +1,32 @@ +export interface ChartData { + Time: Date; + Visitors: number | null; + Color?: string; +} + +export const originalList: ChartData[] = [ + { Time: new Date(2024, 6, 1, 0, 0, 0), Visitors: 150 }, + { Time: new Date(2024, 6, 1, 1, 0, 0), Visitors: 160 }, + { Time: new Date(2024, 6, 1, 2, 0, 0), Visitors: 155 }, + { Time: new Date(2024, 6, 1, 3, 0, 0), Visitors: null }, + { Time: new Date(2024, 6, 1, 4, 0, 0), Visitors: 170 }, + { Time: new Date(2024, 6, 1, 5, 0, 0), Visitors: 175 }, + { Time: new Date(2024, 6, 1, 6, 0, 0), Visitors: 145 }, + { Time: new Date(2024, 6, 1, 7, 0, 0), Visitors: 180 }, + { Time: new Date(2024, 6, 1, 8, 0, 0), Visitors: null }, + { Time: new Date(2024, 6, 1, 9, 0, 0), Visitors: 185 }, + { Time: new Date(2024, 6, 1, 10, 0, 0), Visitors: 200 }, + { Time: new Date(2024, 6, 1, 11, 0, 0), Visitors: null }, + { Time: new Date(2024, 6, 1, 12, 0, 0), Visitors: 220 }, + { Time: new Date(2024, 6, 1, 13, 0, 0), Visitors: 230 }, + { Time: new Date(2024, 6, 1, 14, 0, 0), Visitors: null }, + { Time: new Date(2024, 6, 1, 15, 0, 0), Visitors: 250 }, + { Time: new Date(2024, 6, 1, 16, 0, 0), Visitors: 260 }, + { Time: new Date(2024, 6, 1, 17, 0, 0), Visitors: 270 }, + { Time: new Date(2024, 6, 1, 18, 0, 0), Visitors: null }, + { Time: new Date(2024, 6, 1, 19, 0, 0), Visitors: 280 }, + { Time: new Date(2024, 6, 1, 20, 0, 0), Visitors: 250 }, + { Time: new Date(2024, 6, 1, 21, 0, 0), Visitors: 290 }, + { Time: new Date(2024, 6, 1, 22, 0, 0), Visitors: 300 }, + { Time: new Date(2024, 6, 1, 23, 0, 0), Visitors: null } +]; diff --git a/typescript/src/app/chart/data_preprocessing/data_preprocessing.ts b/typescript/src/app/chart/data_preprocessing/data_preprocessing.ts new file mode 100644 index 0000000..c79c917 --- /dev/null +++ b/typescript/src/app/chart/data_preprocessing/data_preprocessing.ts @@ -0,0 +1,167 @@ +import { Chart, DateTime, MultiColoredLineSeries, Legend, Tooltip, Category } from '@syncfusion/ej2-charts'; +import { createSpinner, showSpinner, hideSpinner } from '@syncfusion/ej2-popups'; +import { Button } from '@syncfusion/ej2-buttons'; +import { getAzureChatAIRequest } from '../../ai-models'; + +// ------------------------ +// Chart Data Interface +// ------------------------ +export interface ChartData { + Time: Date; + Visitors: number | null; + Color?: string; +} + +// Original dataset with nulls +export const originalList: ChartData[] = [ + { Time: new Date(2024, 6, 1, 0, 0, 0), Visitors: 150 }, + { Time: new Date(2024, 6, 1, 1, 0, 0), Visitors: 160 }, + { Time: new Date(2024, 6, 1, 2, 0, 0), Visitors: 155 }, + { Time: new Date(2024, 6, 1, 3, 0, 0), Visitors: null }, + { Time: new Date(2024, 6, 1, 4, 0, 0), Visitors: 170 }, + { Time: new Date(2024, 6, 1, 5, 0, 0), Visitors: 175 }, + { Time: new Date(2024, 6, 1, 6, 0, 0), Visitors: 145 }, + { Time: new Date(2024, 6, 1, 7, 0, 0), Visitors: 180 }, + { Time: new Date(2024, 6, 1, 8, 0, 0), Visitors: null }, + { Time: new Date(2024, 6, 1, 9, 0, 0), Visitors: 185 }, + { Time: new Date(2024, 6, 1, 10, 0, 0), Visitors: 200 }, + { Time: new Date(2024, 6, 1, 11, 0, 0), Visitors: null }, + { Time: new Date(2024, 6, 1, 12, 0, 0), Visitors: 220 }, + { Time: new Date(2024, 6, 1, 13, 0, 0), Visitors: 230 }, + { Time: new Date(2024, 6, 1, 14, 0, 0), Visitors: null }, + { Time: new Date(2024, 6, 1, 15, 0, 0), Visitors: 250 }, + { Time: new Date(2024, 6, 1, 16, 0, 0), Visitors: 260 }, + { Time: new Date(2024, 6, 1, 17, 0, 0), Visitors: 270 }, + { Time: new Date(2024, 6, 1, 18, 0, 0), Visitors: null }, + { Time: new Date(2024, 6, 1, 19, 0, 0), Visitors: 280 }, + { Time: new Date(2024, 6, 1, 20, 0, 0), Visitors: 250 }, + { Time: new Date(2024, 6, 1, 21, 0, 0), Visitors: 290 }, + { Time: new Date(2024, 6, 1, 22, 0, 0), Visitors: 300 }, + { Time: new Date(2024, 6, 1, 23, 0, 0), Visitors: null }, +]; + +// ------------------------ +// Chart Setup +// ------------------------ +Chart.Inject(DateTime, MultiColoredLineSeries, Legend, Tooltip, Category); + +let ChartDataCollection: ChartData[] = [...originalList]; + +const chart = new Chart({ + primaryXAxis: { + valueType: 'DateTime', + minimum: new Date(2024, 6, 1, 0, 0, 0), + maximum: new Date(2024, 6, 1, 23, 0, 0), + labelFormat: 'h a', + majorGridLines: { width: 0 }, + }, + primaryYAxis: { minimum: 140, maximum: 320, interval: 30 }, + legendSettings: { visible: true, position: 'Top' }, + series: [{ + dataSource: ChartDataCollection, + xName: 'Time', + yName: 'Visitors', + pointColorMapping: 'Color', + name: 'Visitors', + type: 'MultiColoredLine', + width: 1, + fill: '#6f16ef', + + }], + title: 'E-Commerce Website Traffic Data', + subTitle: 'AI-powered data cleaning and preprocessing for tracking hourly website visitors', +}); + +chart.appendTo('#Chart'); + +// ------------------------ +// Spinner Setup +// ------------------------ +const chartWrapper = document.querySelector('.chart-wrapper') as HTMLElement; +createSpinner({ + target: chartWrapper, + cssClass: 'chart-spinner-overlay', +}); + +// ------------------------ +// AI Assist Button +// ------------------------ +const button = new Button({ + cssClass: 'chart-action-button', + isPrimary: true, + + iconCss: 'e-icons e-ai-chat', +}); +button.appendTo('#aiAssistBtn'); + +button.element.addEventListener('click', async () => { + // Show spinner immediately + showSpinner(chartWrapper); + + // Wait for browser to render spinner + await new Promise(requestAnimationFrame); + + try { + const prompt = GeneratePrompt(originalList); + const response: string | null = await getAzureChatAIRequest({ messages: [{ role: 'user', content: prompt }] }); + + if (!response) { + console.error('AI response is null'); + return; + } + + const processed = ConvertAIResponseToChartData(response, originalList); + + if (processed.length > 0) { + ChartDataCollection = processed; + chart.series[0].dataSource = ChartDataCollection; + chart.refresh(); + } + + } catch (err) { + console.error('Error during AI processing:', err); + } finally { + // Hide spinner after 3 seconds max + setTimeout(() => hideSpinner(chartWrapper), 1000); + } +}); + +// ------------------------ +// Utility Functions +// ------------------------ +function pad(n: number): string { + return n.toString().padStart(2, '0'); +} + +function GeneratePrompt(data: ChartData[]): string { + let prompt = 'Clean the following e-commerce website traffic data, resolve outliers and fill missing values:\n'; + data.forEach(d => { + prompt += `${d.Time.getFullYear()}-${pad(d.Time.getMonth()+1)}-${pad(d.Time.getDate())}-${pad(d.Time.getHours())}-${pad(d.Time.getMinutes())}-${pad(d.Time.getSeconds())}: ${d.Visitors}\n`; + }); + prompt += 'and the output cleaned data should be in the yyyy-MM-dd-HH-m-ss:Value format, no other explanation required'; + return prompt; +} + +function ConvertAIResponseToChartData(response: string, original: ChartData[]): ChartData[] { + const lines = response.split('\n').filter(l => l.trim() !== ''); + const result: ChartData[] = []; + let count = 0; + + for (let line of lines) { + const parts = line.split(':'); + if (parts.length === 2) { + const [timeStr, valueStr] = parts; + const [y, m, d, h, min, s] = timeStr.trim().split('-').map(Number); + const date = new Date(y, m - 1, d, h, min, s); + const visitors = parseFloat(valueStr.trim()); + + const isCurrNull = original[count]?.Visitors === null; + const isNextNull = !original[count + 1] || original[count + 1].Visitors === null; + const color = (isCurrNull || isNextNull) ? '#D84227' : '#6f16ef'; + + result.push({ Time: date, Visitors: visitors, Color: color }); + count++; + } + } + return result; +} \ No newline at end of file diff --git a/typescript/src/app/chart/data_preprocessing/index.html b/typescript/src/app/chart/data_preprocessing/index.html new file mode 100644 index 0000000..e8d0496 --- /dev/null +++ b/typescript/src/app/chart/data_preprocessing/index.html @@ -0,0 +1,33 @@ + + + + + Data Preprocessing + + + + +

Data Preprocessing

+ +
+
+ +

In this sample, a dataset containing missing values is visualized using the Syncfusion Chart component. An AI Assist button is provided to preprocess the data and assign the cleaned dataset to the chart. After preprocessing, the chart is rendered offering a complete and accurate visualization.

+ + + + + + +
+ + + + + + + + + \ No newline at end of file diff --git a/typescript/src/app/chart/data_preprocessing/style.css b/typescript/src/app/chart/data_preprocessing/style.css new file mode 100644 index 0000000..29124d0 --- /dev/null +++ b/typescript/src/app/chart/data_preprocessing/style.css @@ -0,0 +1,58 @@ +/* new */ +.chart-wrapper { + position: relative; +} + +#aiAssistBtn.e-btn { + position: absolute; + top: 10px; + right: 10px; + padding: 8px; + line-height: 14px; + + font-size: 16px; + + padding: 8.2px 16px; +} + +.chart-spinner { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 20; +} + + +.chart-action-button { + position: absolute; + top: 10px; + right: 10px; + display: flex; align-items: center; justify-content: center; + border: none; cursor: pointer; + + +} + +.chart-action-button .e-icons { color: rgb(252, 252, 252); font-size: 17px; + line-height: 17px; + font-weight: 400; +} + + +.chart-spinner-overlay { + position: absolute; + top: 50%; left: 50%; + transform: translate(-50%, -50%); + z-index: 20; + display: flex; align-items: center; justify-content: center; + +} +/* Make the spinner overlay cover the chart and center the spinner */ +.chart-spinner-overlay { + position: absolute !important; + top: 50% !important; + left: 50% !important; + transform: translate(-50%, -50%) !important; + z-index: 1000; +} \ No newline at end of file diff --git a/typescript/src/index.ts b/typescript/src/index.ts index 2b7b8ad..ea2c376 100644 --- a/typescript/src/index.ts +++ b/typescript/src/index.ts @@ -26,6 +26,8 @@ let treeData: { [key: string]: Object }[] = [ { id: '/smartpaste/index.html', name: 'Smart Paste' }, { id: '/smarttextarea/index.html', name: 'Smart TexArea' }, { id: '/combobox/local-embedding/index.html', name: 'ComboBox', url: '' }, + { id: '/chart/data_preprocessing/index.html', name: 'Chart', url: '' }, + { id: '/scheduler/smart_scheduler/index.html', name: 'Schedule', url: '' }, diff --git a/vue/src/ai-components/ai-chart/chart/amazon.png b/vue/src/ai-components/ai-chart/chart/amazon.png new file mode 100644 index 0000000..2805452 Binary files /dev/null and b/vue/src/ai-components/ai-chart/chart/amazon.png differ diff --git a/vue/src/ai-components/ai-chart/chart/google.png b/vue/src/ai-components/ai-chart/chart/google.png new file mode 100644 index 0000000..2509038 Binary files /dev/null and b/vue/src/ai-components/ai-chart/chart/google.png differ diff --git a/vue/src/ai-components/ai-chart/chart/microsoft.png b/vue/src/ai-components/ai-chart/chart/microsoft.png new file mode 100644 index 0000000..60dc2d4 Binary files /dev/null and b/vue/src/ai-components/ai-chart/chart/microsoft.png differ diff --git a/vue/src/ai-components/ai-chart/chart/tesla.png b/vue/src/ai-components/ai-chart/chart/tesla.png new file mode 100644 index 0000000..5fc6954 Binary files /dev/null and b/vue/src/ai-components/ai-chart/chart/tesla.png differ diff --git a/vue/src/ai-components/ai-chart/data-preprocessing.vue b/vue/src/ai-components/ai-chart/data-preprocessing.vue new file mode 100644 index 0000000..34bc303 --- /dev/null +++ b/vue/src/ai-components/ai-chart/data-preprocessing.vue @@ -0,0 +1,281 @@ + + + + + \ No newline at end of file diff --git a/vue/src/ai-components/ai-chart/data/amzn-data.json b/vue/src/ai-components/ai-chart/data/amzn-data.json new file mode 100644 index 0000000..afdbe95 --- /dev/null +++ b/vue/src/ai-components/ai-chart/data/amzn-data.json @@ -0,0 +1,1829 @@ +[ + { + "Date": "2024-07-01", + "Open": 192.19, + "High": 192.9, + "Low": 191.49, + "Close": 192.09 + }, + { + "Date": "2024-07-02", + "Open": 190.43, + "High": 190.85, + "Low": 189.69, + "Close": 190.34 + }, + { + "Date": "2024-07-03", + "Open": 192.96, + "High": 193.18, + "Low": 191.23, + "Close": 192.87 + }, + { + "Date": "2024-07-04", + "Open": 195.7, + "High": 198.88, + "Low": 195.46, + "Close": 198.11 + }, + { + "Date": "2024-07-05", + "Open": 197.2, + "High": 200.88, + "Low": 193.9, + "Close": 194.67 + }, + { + "Date": "2024-07-08", + "Open": 190.88, + "High": 192.6, + "Low": 190.19, + "Close": 191.82 + }, + { + "Date": "2024-07-09", + "Open": 194.89, + "High": 197.87, + "Low": 192.26, + "Close": 194.36 + }, + { + "Date": "2024-07-10", + "Open": 190.99, + "High": 192.37, + "Low": 189.83, + "Close": 191.04 + }, + { + "Date": "2024-07-11", + "Open": 194.27, + "High": 196.85, + "Low": 191.88, + "Close": 193.23 + }, + { + "Date": "2024-07-12", + "Open": 191.67, + "High": 193.12, + "Low": 188.07, + "Close": 190.86 + }, + { + "Date": "2024-07-15", + "Open": 192.59, + "High": 192.73, + "Low": 191.99, + "Close": 192.57 + }, + { + "Date": "2024-07-16", + "Open": 193.34, + "High": 195.1, + "Low": 192.36, + "Close": 193.96 + }, + { + "Date": "2024-07-17", + "Open": 194.46, + "High": 195.2, + "Low": 193.46, + "Close": 194.16 + }, + { + "Date": "2024-07-18", + "Open": 196.32, + "High": 198.22, + "Low": 194.28, + "Close": 196.39 + }, + { + "Date": "2024-07-19", + "Open": 199.01, + "High": 201.2, + "Low": 198.41, + "Close": 198.68 + }, + { + "Date": "2024-07-22", + "Open": 198.64, + "High": 199.98, + "Low": 197.48, + "Close": 197.93 + }, + { + "Date": "2024-07-23", + "Open": 199.45, + "High": 202.09, + "Low": 198.77, + "Close": 199.35 + }, + { + "Date": "2024-07-24", + "Open": 202.32, + "High": 202.98, + "Low": 198.69, + "Close": 201.41 + }, + { + "Date": "2024-07-25", + "Open": 204.2, + "High": 204.73, + "Low": 201.08, + "Close": 203.53 + }, + { + "Date": "2024-07-26", + "Open": 206.69, + "High": 207.5, + "Low": 203.42, + "Close": 204.02 + }, + { + "Date": "2024-07-29", + "Open": 201.51, + "High": 203.13, + "Low": 198.05, + "Close": 202.99 + }, + { + "Date": "2024-07-30", + "Open": 203.27, + "High": 205.79, + "Low": 201.22, + "Close": 202.57 + }, + { + "Date": "2024-07-31", + "Open": 214.69, + "High": 214.78, + "Low": 213.21, + "Close": 214.04 + }, + { + "Date": "2024-08-01", + "Open": 208.66, + "High": 210.44, + "Low": 208.19, + "Close": 209.46 + }, + { + "Date": "2024-08-02", + "Open": 209.26, + "High": 209.86, + "Low": 207.57, + "Close": 208.31 + }, + { + "Date": "2024-08-05", + "Open": 205.62, + "High": 206.82, + "Low": 205.5, + "Close": 206.54 + }, + { + "Date": "2024-08-06", + "Open": 206.32, + "High": 206.84, + "Low": 206.0, + "Close": 206.72 + }, + { + "Date": "2024-08-07", + "Open": 205.79, + "High": 206.03, + "Low": 205.1, + "Close": 205.97 + }, + { + "Date": "2024-08-08", + "Open": 207.89, + "High": 210.01, + "Low": 204.93, + "Close": 208.97 + }, + { + "Date": "2024-08-09", + "Open": 205.51, + "High": 206.31, + "Low": 202.09, + "Close": 204.19 + }, + { + "Date": "2024-08-12", + "Open": 203.98, + "High": 204.0, + "Low": 201.04, + "Close": 203.99 + }, + { + "Date": "2024-08-13", + "Open": 206.41, + "High": 207.58, + "Low": 204.61, + "Close": 207.38 + }, + { + "Date": "2024-08-14", + "Open": 208.28, + "High": 208.69, + "Low": 207.82, + "Close": 207.83 + }, + { + "Date": "2024-08-15", + "Open": 209.35, + "High": 210.26, + "Low": 205.57, + "Close": 208.55 + }, + { + "Date": "2024-08-16", + "Open": 208.34, + "High": 212.07, + "Low": 204.61, + "Close": 209.24 + }, + { + "Date": "2024-08-19", + "Open": 220.26, + "High": 220.85, + "Low": 219.53, + "Close": 220.1 + }, + { + "Date": "2024-08-20", + "Open": 218.45, + "High": 219.96, + "Low": 218.0, + "Close": 219.01 + }, + { + "Date": "2024-08-21", + "Open": 216.92, + "High": 217.62, + "Low": 215.93, + "Close": 216.22 + }, + { + "Date": "2024-08-22", + "Open": 216.61, + "High": 217.0, + "Low": 215.1, + "Close": 215.98 + }, + { + "Date": "2024-08-23", + "Open": 216.54, + "High": 217.42, + "Low": 215.69, + "Close": 216.38 + }, + { + "Date": "2024-08-26", + "Open": 215.55, + "High": 216.05, + "Low": 214.14, + "Close": 215.1 + }, + { + "Date": "2024-08-27", + "Open": 218.7, + "High": 219.12, + "Low": 217.8, + "Close": 218.41 + }, + { + "Date": "2024-08-28", + "Open": 220.42, + "High": 221.68, + "Low": 219.76, + "Close": 221.38 + }, + { + "Date": "2024-08-29", + "Open": 217.49, + "High": 218.53, + "Low": 217.06, + "Close": 217.91 + }, + { + "Date": "2024-08-30", + "Open": 218.01, + "High": 219.04, + "Low": 217.44, + "Close": 218.74 + }, + { + "Date": "2024-09-02", + "Open": 219.12, + "High": 222.26, + "Low": 215.9, + "Close": 221.34 + }, + { + "Date": "2024-09-03", + "Open": 220.74, + "High": 224.84, + "Low": 218.47, + "Close": 221.51 + }, + { + "Date": "2024-09-04", + "Open": 220.55, + "High": 223.45, + "Low": 219.76, + "Close": 222.13 + }, + { + "Date": "2024-09-05", + "Open": 220.15, + "High": 220.71, + "Low": 218.92, + "Close": 220.47 + }, + { + "Date": "2024-09-06", + "Open": 218.6, + "High": 220.56, + "Low": 217.74, + "Close": 218.16 + }, + { + "Date": "2024-09-09", + "Open": 214.35, + "High": 217.2, + "Low": 210.95, + "Close": 211.85 + }, + { + "Date": "2024-09-10", + "Open": 209.42, + "High": 210.5, + "Low": 209.07, + "Close": 209.12 + }, + { + "Date": "2024-09-11", + "Open": 207.41, + "High": 208.47, + "Low": 204.12, + "Close": 206.97 + }, + { + "Date": "2024-09-12", + "Open": 204.14, + "High": 205.98, + "Low": 200.22, + "Close": 201.97 + }, + { + "Date": "2024-09-13", + "Open": 201.24, + "High": 205.15, + "Low": 200.33, + "Close": 201.03 + }, + { + "Date": "2024-09-16", + "Open": 199.11, + "High": 199.39, + "Low": 195.31, + "Close": 198.86 + }, + { + "Date": "2024-09-17", + "Open": 196.76, + "High": 199.76, + "Low": 193.67, + "Close": 198.32 + }, + { + "Date": "2024-09-18", + "Open": 194.53, + "High": 195.14, + "Low": 192.88, + "Close": 194.31 + }, + { + "Date": "2024-09-19", + "Open": 192.02, + "High": 195.09, + "Low": 191.11, + "Close": 191.26 + }, + { + "Date": "2024-09-20", + "Open": 187.81, + "High": 189.19, + "Low": 186.3, + "Close": 186.64 + }, + { + "Date": "2024-09-23", + "Open": 184.36, + "High": 187.13, + "Low": 182.15, + "Close": 183.64 + }, + { + "Date": "2024-09-24", + "Open": 182.18, + "High": 184.64, + "Low": 179.59, + "Close": 181.42 + }, + { + "Date": "2024-09-25", + "Open": 184.19, + "High": 184.25, + "Low": 180.86, + "Close": 182.16 + }, + { + "Date": "2024-09-26", + "Open": 179.79, + "High": 180.58, + "Low": 179.64, + "Close": 180.06 + }, + { + "Date": "2024-09-27", + "Open": 183.16, + "High": 185.58, + "Low": 180.75, + "Close": 183.72 + }, + { + "Date": "2024-09-30", + "Open": 187.33, + "High": 187.71, + "Low": 183.86, + "Close": 187.22 + }, + { + "Date": "2024-10-01", + "Open": 188.65, + "High": 188.75, + "Low": 187.8, + "Close": 187.84 + }, + { + "Date": "2024-10-02", + "Open": 186.21, + "High": 186.78, + "Low": 183.75, + "Close": 184.39 + }, + { + "Date": "2024-10-03", + "Open": 187.18, + "High": 190.08, + "Low": 185.05, + "Close": 187.32 + }, + { + "Date": "2024-10-04", + "Open": 184.08, + "High": 186.25, + "Low": 180.59, + "Close": 182.53 + }, + { + "Date": "2024-10-07", + "Open": 179.66, + "High": 182.99, + "Low": 176.27, + "Close": 180.66 + }, + { + "Date": "2024-10-08", + "Open": 182.76, + "High": 186.4, + "Low": 179.53, + "Close": 184.99 + }, + { + "Date": "2024-10-09", + "Open": 184.5, + "High": 186.52, + "Low": 181.11, + "Close": 186.42 + }, + { + "Date": "2024-10-10", + "Open": 187.48, + "High": 189.39, + "Low": 186.48, + "Close": 187.78 + }, + { + "Date": "2024-10-11", + "Open": 191.06, + "High": 194.69, + "Low": 190.55, + "Close": 193.48 + }, + { + "Date": "2024-10-14", + "Open": 193.98, + "High": 196.02, + "Low": 192.42, + "Close": 192.83 + }, + { + "Date": "2024-10-15", + "Open": 189.99, + "High": 191.31, + "Low": 186.61, + "Close": 189.98 + }, + { + "Date": "2024-10-16", + "Open": 188.25, + "High": 188.94, + "Low": 187.39, + "Close": 187.46 + }, + { + "Date": "2024-10-17", + "Open": 189.99, + "High": 190.44, + "Low": 189.92, + "Close": 190.16 + }, + { + "Date": "2024-10-18", + "Open": 193.75, + "High": 196.45, + "Low": 192.38, + "Close": 195.2 + }, + { + "Date": "2024-10-21", + "Open": 196.39, + "High": 200.25, + "Low": 195.65, + "Close": 196.27 + }, + { + "Date": "2024-10-22", + "Open": 193.59, + "High": 195.98, + "Low": 193.26, + "Close": 194.4 + }, + { + "Date": "2024-10-23", + "Open": 191.6, + "High": 194.19, + "Low": 190.19, + "Close": 193.23 + }, + { + "Date": "2024-10-24", + "Open": 191.61, + "High": 191.68, + "Low": 189.06, + "Close": 189.12 + }, + { + "Date": "2024-10-25", + "Open": 188.53, + "High": 190.95, + "Low": 187.83, + "Close": 190.24 + }, + { + "Date": "2024-10-28", + "Open": 190.78, + "High": 190.85, + "Low": 190.03, + "Close": 190.68 + }, + { + "Date": "2024-10-29", + "Open": 192.5, + "High": 192.63, + "Low": 189.37, + "Close": 192.45 + }, + { + "Date": "2024-10-30", + "Open": 195.2, + "High": 196.64, + "Low": 192.47, + "Close": 193.05 + }, + { + "Date": "2024-10-31", + "Open": 195.96, + "High": 199.34, + "Low": 193.96, + "Close": 197.35 + }, + { + "Date": "2024-11-01", + "Open": 195.71, + "High": 197.28, + "Low": 192.66, + "Close": 195.82 + }, + { + "Date": "2024-11-04", + "Open": 196.1, + "High": 197.4, + "Low": 193.82, + "Close": 195.77 + }, + { + "Date": "2024-11-05", + "Open": 194.6, + "High": 194.79, + "Low": 194.02, + "Close": 194.53 + }, + { + "Date": "2024-11-06", + "Open": 191.0, + "High": 193.86, + "Low": 189.85, + "Close": 192.58 + }, + { + "Date": "2024-11-07", + "Open": 189.1, + "High": 190.47, + "Low": 188.36, + "Close": 189.17 + }, + { + "Date": "2024-11-08", + "Open": 187.13, + "High": 188.9, + "Low": 184.56, + "Close": 185.4 + }, + { + "Date": "2024-11-11", + "Open": 186.41, + "High": 190.01, + "Low": 185.6, + "Close": 189.86 + }, + { + "Date": "2024-11-12", + "Open": 191.36, + "High": 191.42, + "Low": 191.18, + "Close": 191.35 + }, + { + "Date": "2024-11-13", + "Open": 194.67, + "High": 198.53, + "Low": 191.8, + "Close": 193.42 + }, + { + "Date": "2024-11-14", + "Open": 197.25, + "High": 198.59, + "Low": 195.02, + "Close": 196.06 + }, + { + "Date": "2024-11-15", + "Open": 199.47, + "High": 201.98, + "Low": 195.49, + "Close": 198.1 + }, + { + "Date": "2024-11-18", + "Open": 198.79, + "High": 200.55, + "Low": 195.52, + "Close": 199.53 + }, + { + "Date": "2024-11-19", + "Open": 198.33, + "High": 199.06, + "Low": 197.8, + "Close": 198.08 + }, + { + "Date": "2024-11-20", + "Open": 197.7, + "High": 199.95, + "Low": 196.06, + "Close": 198.09 + }, + { + "Date": "2024-11-21", + "Open": 196.88, + "High": 197.63, + "Low": 196.7, + "Close": 197.27 + }, + { + "Date": "2024-11-22", + "Open": 194.57, + "High": 195.2, + "Low": 191.02, + "Close": 193.02 + }, + { + "Date": "2024-11-25", + "Open": 189.27, + "High": 190.92, + "Low": 188.07, + "Close": 189.39 + }, + { + "Date": "2024-11-26", + "Open": 187.09, + "High": 188.12, + "Low": 186.13, + "Close": 187.32 + }, + { + "Date": "2024-11-27", + "Open": 186.73, + "High": 188.27, + "Low": 183.88, + "Close": 186.22 + }, + { + "Date": "2024-11-28", + "Open": 186.66, + "High": 190.04, + "Low": 182.98, + "Close": 189.97 + }, + { + "Date": "2024-11-29", + "Open": 191.89, + "High": 194.08, + "Low": 191.07, + "Close": 193.31 + }, + { + "Date": "2024-12-02", + "Open": 190.06, + "High": 190.25, + "Low": 187.75, + "Close": 188.71 + }, + { + "Date": "2024-12-03", + "Open": 188.97, + "High": 189.8, + "Low": 188.38, + "Close": 189.78 + }, + { + "Date": "2024-12-04", + "Open": 192.27, + "High": 195.81, + "Low": 191.38, + "Close": 195.26 + }, + { + "Date": "2024-12-05", + "Open": 191.95, + "High": 193.78, + "Low": 188.66, + "Close": 191.23 + }, + { + "Date": "2024-12-06", + "Open": 194.02, + "High": 196.79, + "Low": 191.51, + "Close": 193.49 + }, + { + "Date": "2024-12-09", + "Open": 196.7, + "High": 199.49, + "Low": 195.09, + "Close": 195.64 + }, + { + "Date": "2024-12-10", + "Open": 194.77, + "High": 196.67, + "Low": 192.89, + "Close": 195.91 + }, + { + "Date": "2024-12-11", + "Open": 194.98, + "High": 198.15, + "Low": 192.08, + "Close": 192.86 + }, + { + "Date": "2024-12-12", + "Open": 192.9, + "High": 195.34, + "Low": 189.5, + "Close": 190.89 + }, + { + "Date": "2024-12-13", + "Open": 193.27, + "High": 193.35, + "Low": 190.87, + "Close": 191.32 + }, + { + "Date": "2024-12-16", + "Open": 193.34, + "High": 193.73, + "Low": 189.73, + "Close": 190.55 + }, + { + "Date": "2024-12-17", + "Open": 189.68, + "High": 193.18, + "Low": 186.14, + "Close": 187.61 + }, + { + "Date": "2024-12-18", + "Open": 184.81, + "High": 187.6, + "Low": 183.76, + "Close": 187.12 + }, + { + "Date": "2024-12-19", + "Open": 189.94, + "High": 193.17, + "Low": 188.73, + "Close": 189.54 + }, + { + "Date": "2024-12-20", + "Open": 191.52, + "High": 192.12, + "Low": 188.86, + "Close": 190.69 + }, + { + "Date": "2024-12-23", + "Open": 188.2, + "High": 190.33, + "Low": 185.65, + "Close": 189.03 + }, + { + "Date": "2024-12-24", + "Open": 189.97, + "High": 190.99, + "Low": 186.23, + "Close": 189.82 + }, + { + "Date": "2024-12-25", + "Open": 189.41, + "High": 189.62, + "Low": 187.56, + "Close": 189.47 + }, + { + "Date": "2024-12-26", + "Open": 192.06, + "High": 192.92, + "Low": 188.35, + "Close": 189.02 + }, + { + "Date": "2024-12-27", + "Open": 186.58, + "High": 188.72, + "Low": 184.74, + "Close": 187.08 + }, + { + "Date": "2024-12-30", + "Open": 189.41, + "High": 192.12, + "Low": 187.98, + "Close": 190.09 + }, + { + "Date": "2024-12-31", + "Open": 192.13, + "High": 194.13, + "Low": 189.28, + "Close": 191.55 + }, + { + "Date": "2025-01-01", + "Open": 191.2, + "High": 193.81, + "Low": 190.1, + "Close": 191.68 + }, + { + "Date": "2025-01-02", + "Open": 188.0, + "High": 190.58, + "Low": 185.8, + "Close": 187.84 + }, + { + "Date": "2025-01-03", + "Open": 184.94, + "High": 188.34, + "Low": 182.09, + "Close": 187.13 + }, + { + "Date": "2025-01-06", + "Open": 186.96, + "High": 187.37, + "Low": 185.26, + "Close": 185.76 + }, + { + "Date": "2025-01-07", + "Open": 184.81, + "High": 187.11, + "Low": 181.22, + "Close": 183.96 + }, + { + "Date": "2025-01-08", + "Open": 187.46, + "High": 189.82, + "Low": 184.69, + "Close": 185.39 + }, + { + "Date": "2025-01-09", + "Open": 185.28, + "High": 186.48, + "Low": 182.28, + "Close": 186.45 + }, + { + "Date": "2025-01-10", + "Open": 189.6, + "High": 192.09, + "Low": 187.7, + "Close": 188.59 + }, + { + "Date": "2025-01-13", + "Open": 190.5, + "High": 192.25, + "Low": 188.59, + "Close": 191.56 + }, + { + "Date": "2025-01-14", + "Open": 190.87, + "High": 192.38, + "Low": 189.85, + "Close": 190.37 + }, + { + "Date": "2025-01-15", + "Open": 192.4, + "High": 192.71, + "Low": 189.79, + "Close": 190.67 + }, + { + "Date": "2025-01-16", + "Open": 191.37, + "High": 193.49, + "Low": 190.47, + "Close": 191.98 + }, + { + "Date": "2025-01-17", + "Open": 195.65, + "High": 195.73, + "Low": 194.55, + "Close": 194.57 + }, + { + "Date": "2025-01-20", + "Open": 196.03, + "High": 197.75, + "Low": 193.92, + "Close": 196.32 + }, + { + "Date": "2025-01-21", + "Open": 195.26, + "High": 197.99, + "Low": 192.95, + "Close": 193.96 + }, + { + "Date": "2025-01-22", + "Open": 194.56, + "High": 195.19, + "Low": 193.74, + "Close": 195.09 + }, + { + "Date": "2025-01-23", + "Open": 194.8, + "High": 195.29, + "Low": 193.59, + "Close": 194.8 + }, + { + "Date": "2025-01-24", + "Open": 194.71, + "High": 196.74, + "Low": 194.28, + "Close": 196.02 + }, + { + "Date": "2025-01-27", + "Open": 195.27, + "High": 196.04, + "Low": 192.61, + "Close": 194.22 + }, + { + "Date": "2025-01-28", + "Open": 196.06, + "High": 199.1, + "Low": 192.26, + "Close": 195.15 + }, + { + "Date": "2025-01-29", + "Open": 193.13, + "High": 193.8, + "Low": 192.23, + "Close": 193.04 + }, + { + "Date": "2025-01-30", + "Open": 194.52, + "High": 197.86, + "Low": 193.59, + "Close": 194.45 + }, + { + "Date": "2025-01-31", + "Open": 197.99, + "High": 199.06, + "Low": 196.81, + "Close": 196.94 + }, + { + "Date": "2025-02-03", + "Open": 196.51, + "High": 200.41, + "Low": 195.5, + "Close": 200.12 + }, + { + "Date": "2025-02-04", + "Open": 200.87, + "High": 203.0, + "Low": 197.66, + "Close": 199.47 + }, + { + "Date": "2025-02-05", + "Open": 200.9, + "High": 203.92, + "Low": 200.64, + "Close": 201.25 + }, + { + "Date": "2025-02-06", + "Open": 197.93, + "High": 200.72, + "Low": 195.59, + "Close": 199.07 + }, + { + "Date": "2025-02-07", + "Open": 197.64, + "High": 197.92, + "Low": 194.88, + "Close": 195.31 + }, + { + "Date": "2025-02-10", + "Open": 193.4, + "High": 195.13, + "Low": 193.1, + "Close": 193.45 + }, + { + "Date": "2025-02-11", + "Open": 195.24, + "High": 195.72, + "Low": 194.97, + "Close": 195.68 + }, + { + "Date": "2025-02-12", + "Open": 197.99, + "High": 200.15, + "Low": 196.64, + "Close": 197.67 + }, + { + "Date": "2025-02-13", + "Open": 200.35, + "High": 202.8, + "Low": 197.77, + "Close": 200.36 + }, + { + "Date": "2025-02-14", + "Open": 202.5, + "High": 203.28, + "Low": 200.92, + "Close": 201.61 + }, + { + "Date": "2025-02-17", + "Open": 202.19, + "High": 203.2, + "Low": 198.23, + "Close": 203.16 + }, + { + "Date": "2025-02-18", + "Open": 201.78, + "High": 202.59, + "Low": 198.35, + "Close": 200.95 + }, + { + "Date": "2025-02-19", + "Open": 197.84, + "High": 200.44, + "Low": 194.78, + "Close": 198.81 + }, + { + "Date": "2025-02-20", + "Open": 197.35, + "High": 199.67, + "Low": 197.32, + "Close": 197.85 + }, + { + "Date": "2025-02-21", + "Open": 201.6, + "High": 202.21, + "Low": 197.95, + "Close": 198.49 + }, + { + "Date": "2025-02-24", + "Open": 198.12, + "High": 199.48, + "Low": 194.53, + "Close": 194.94 + }, + { + "Date": "2025-02-25", + "Open": 198.54, + "High": 201.16, + "Low": 196.12, + "Close": 199.04 + }, + { + "Date": "2025-02-26", + "Open": 199.24, + "High": 201.2, + "Low": 197.42, + "Close": 199.3 + }, + { + "Date": "2025-02-27", + "Open": 198.09, + "High": 200.08, + "Low": 197.34, + "Close": 199.98 + }, + { + "Date": "2025-02-28", + "Open": 196.19, + "High": 198.79, + "Low": 192.44, + "Close": 193.75 + }, + { + "Date": "2025-03-03", + "Open": 190.71, + "High": 192.19, + "Low": 189.7, + "Close": 192.02 + }, + { + "Date": "2025-03-04", + "Open": 188.55, + "High": 189.71, + "Low": 185.24, + "Close": 185.68 + }, + { + "Date": "2025-03-05", + "Open": 188.34, + "High": 191.18, + "Low": 185.09, + "Close": 186.68 + }, + { + "Date": "2025-03-06", + "Open": 188.94, + "High": 191.64, + "Low": 186.93, + "Close": 190.76 + }, + { + "Date": "2025-03-07", + "Open": 186.96, + "High": 189.67, + "Low": 186.35, + "Close": 188.76 + }, + { + "Date": "2025-03-10", + "Open": 188.08, + "High": 190.01, + "Low": 184.45, + "Close": 188.09 + }, + { + "Date": "2025-03-11", + "Open": 184.38, + "High": 187.34, + "Low": 181.96, + "Close": 186.02 + }, + { + "Date": "2025-03-12", + "Open": 188.31, + "High": 190.35, + "Low": 187.27, + "Close": 189.34 + }, + { + "Date": "2025-03-13", + "Open": 187.9, + "High": 191.49, + "Low": 186.94, + "Close": 191.21 + }, + { + "Date": "2025-03-14", + "Open": 194.0, + "High": 194.05, + "Low": 191.15, + "Close": 191.25 + }, + { + "Date": "2025-03-17", + "Open": 190.23, + "High": 192.58, + "Low": 187.41, + "Close": 189.36 + }, + { + "Date": "2025-03-18", + "Open": 187.86, + "High": 190.87, + "Low": 184.83, + "Close": 186.75 + }, + { + "Date": "2025-03-19", + "Open": 188.11, + "High": 189.74, + "Low": 187.99, + "Close": 188.33 + }, + { + "Date": "2025-03-20", + "Open": 189.83, + "High": 191.59, + "Low": 187.47, + "Close": 189.65 + }, + { + "Date": "2025-03-21", + "Open": 189.5, + "High": 191.04, + "Low": 188.55, + "Close": 190.91 + }, + { + "Date": "2025-03-24", + "Open": 187.76, + "High": 187.87, + "Low": 186.22, + "Close": 186.66 + }, + { + "Date": "2025-03-25", + "Open": 185.86, + "High": 188.35, + "Low": 184.76, + "Close": 186.33 + }, + { + "Date": "2025-03-26", + "Open": 188.92, + "High": 192.13, + "Low": 187.26, + "Close": 190.52 + }, + { + "Date": "2025-03-27", + "Open": 187.73, + "High": 190.94, + "Low": 184.35, + "Close": 188.07 + }, + { + "Date": "2025-03-28", + "Open": 190.09, + "High": 191.87, + "Low": 189.81, + "Close": 190.76 + }, + { + "Date": "2025-03-31", + "Open": 191.16, + "High": 194.32, + "Low": 189.5, + "Close": 192.15 + }, + { + "Date": "2025-04-01", + "Open": 191.3, + "High": 193.89, + "Low": 189.82, + "Close": 190.23 + }, + { + "Date": "2025-04-02", + "Open": 189.23, + "High": 191.67, + "Low": 185.46, + "Close": 188.48 + }, + { + "Date": "2025-04-03", + "Open": 188.84, + "High": 189.28, + "Low": 185.68, + "Close": 188.02 + }, + { + "Date": "2025-04-04", + "Open": 190.86, + "High": 191.66, + "Low": 187.81, + "Close": 188.6 + }, + { + "Date": "2025-04-07", + "Open": 192.34, + "High": 192.76, + "Low": 189.23, + "Close": 189.28 + }, + { + "Date": "2025-04-08", + "Open": 189.05, + "High": 189.96, + "Low": 185.34, + "Close": 185.78 + }, + { + "Date": "2025-04-09", + "Open": 185.49, + "High": 186.5, + "Low": 184.83, + "Close": 185.56 + }, + { + "Date": "2025-04-10", + "Open": 183.37, + "High": 184.43, + "Low": 181.95, + "Close": 183.73 + }, + { + "Date": "2025-04-11", + "Open": 185.13, + "High": 187.46, + "Low": 181.93, + "Close": 185.33 + }, + { + "Date": "2025-04-14", + "Open": 187.6, + "High": 190.27, + "Low": 185.51, + "Close": 189.95 + }, + { + "Date": "2025-04-15", + "Open": 190.88, + "High": 192.97, + "Low": 189.63, + "Close": 189.77 + }, + { + "Date": "2025-04-16", + "Open": 188.61, + "High": 190.9, + "Low": 184.9, + "Close": 189.62 + }, + { + "Date": "2025-04-17", + "Open": 186.83, + "High": 188.31, + "Low": 185.75, + "Close": 188.21 + }, + { + "Date": "2025-04-18", + "Open": 186.04, + "High": 187.81, + "Low": 184.15, + "Close": 186.6 + }, + { + "Date": "2025-04-21", + "Open": 189.18, + "High": 192.56, + "Low": 187.6, + "Close": 188.35 + }, + { + "Date": "2025-04-22", + "Open": 187.13, + "High": 190.76, + "Low": 184.98, + "Close": 185.83 + }, + { + "Date": "2025-04-23", + "Open": 186.47, + "High": 188.85, + "Low": 183.38, + "Close": 187.23 + }, + { + "Date": "2025-04-24", + "Open": 185.73, + "High": 187.7, + "Low": 183.64, + "Close": 187.69 + }, + { + "Date": "2025-04-25", + "Open": 189.65, + "High": 192.07, + "Low": 187.21, + "Close": 189.75 + }, + { + "Date": "2025-04-28", + "Open": 193.47, + "High": 193.87, + "Low": 193.21, + "Close": 193.78 + }, + { + "Date": "2025-04-29", + "Open": 193.54, + "High": 195.51, + "Low": 192.22, + "Close": 193.62 + }, + { + "Date": "2025-04-30", + "Open": 191.5, + "High": 192.72, + "Low": 190.41, + "Close": 190.9 + }, + { + "Date": "2025-05-01", + "Open": 192.24, + "High": 193.01, + "Low": 190.3, + "Close": 191.79 + }, + { + "Date": "2025-05-02", + "Open": 194.01, + "High": 196.64, + "Low": 192.33, + "Close": 195.35 + }, + { + "Date": "2025-05-05", + "Open": 197.69, + "High": 199.7, + "Low": 195.4, + "Close": 197.83 + }, + { + "Date": "2025-05-06", + "Open": 199.14, + "High": 202.89, + "Low": 198.53, + "Close": 201.23 + }, + { + "Date": "2025-05-07", + "Open": 198.75, + "High": 200.37, + "Low": 197.53, + "Close": 197.61 + }, + { + "Date": "2025-05-08", + "Open": 197.85, + "High": 199.24, + "Low": 197.76, + "Close": 198.39 + }, + { + "Date": "2025-05-09", + "Open": 201.13, + "High": 201.43, + "Low": 197.67, + "Close": 200.76 + }, + { + "Date": "2025-05-12", + "Open": 204.11, + "High": 205.45, + "Low": 201.65, + "Close": 203.74 + }, + { + "Date": "2025-05-13", + "Open": 199.88, + "High": 203.56, + "Low": 199.68, + "Close": 203.56 + }, + { + "Date": "2025-05-14", + "Open": 201.28, + "High": 201.93, + "Low": 199.91, + "Close": 201.15 + }, + { + "Date": "2025-05-15", + "Open": 202.73, + "High": 202.81, + "Low": 199.58, + "Close": 202.36 + }, + { + "Date": "2025-05-16", + "Open": 199.21, + "High": 200.9, + "Low": 198.57, + "Close": 198.67 + }, + { + "Date": "2025-05-19", + "Open": 200.23, + "High": 202.05, + "Low": 199.73, + "Close": 201.91 + }, + { + "Date": "2025-05-20", + "Open": 197.93, + "High": 201.53, + "Low": 194.8, + "Close": 198.84 + }, + { + "Date": "2025-05-21", + "Open": 202.61, + "High": 202.75, + "Low": 199.63, + "Close": 199.92 + }, + { + "Date": "2025-05-22", + "Open": 197.65, + "High": 199.18, + "Low": 195.77, + "Close": 197.07 + }, + { + "Date": "2025-05-23", + "Open": 196.25, + "High": 200.11, + "Low": 194.25, + "Close": 198.89 + }, + { + "Date": "2025-05-26", + "Open": 198.76, + "High": 201.5, + "Low": 195.7, + "Close": 200.12 + }, + { + "Date": "2025-05-27", + "Open": 203.56, + "High": 205.91, + "Low": 201.23, + "Close": 205.48 + }, + { + "Date": "2025-05-28", + "Open": 205.67, + "High": 206.43, + "Low": 201.91, + "Close": 204.41 + }, + { + "Date": "2025-05-29", + "Open": 206.86, + "High": 207.2, + "Low": 204.17, + "Close": 207.08 + }, + { + "Date": "2025-05-30", + "Open": 210.74, + "High": 213.69, + "Low": 207.95, + "Close": 210.41 + }, + { + "Date": "2025-06-02", + "Open": 206.73, + "High": 208.0, + "Low": 206.48, + "Close": 207.99 + }, + { + "Date": "2025-06-03", + "Open": 208.64, + "High": 209.48, + "Low": 207.25, + "Close": 208.92 + }, + { + "Date": "2025-06-04", + "Open": 210.59, + "High": 214.67, + "Low": 209.45, + "Close": 212.58 + }, + { + "Date": "2025-06-05", + "Open": 213.38, + "High": 215.6, + "Low": 211.92, + "Close": 215.17 + }, + { + "Date": "2025-06-06", + "Open": 219.46, + "High": 223.49, + "Low": 217.62, + "Close": 219.74 + }, + { + "Date": "2025-06-09", + "Open": 221.38, + "High": 224.98, + "Low": 219.12, + "Close": 221.56 + }, + { + "Date": "2025-06-10", + "Open": 223.59, + "High": 224.61, + "Low": 221.75, + "Close": 222.67 + }, + { + "Date": "2025-06-11", + "Open": 225.79, + "High": 228.61, + "Low": 222.57, + "Close": 225.86 + }, + { + "Date": "2025-06-12", + "Open": 225.06, + "High": 228.81, + "Low": 224.42, + "Close": 224.88 + }, + { + "Date": "2025-06-13", + "Open": 222.65, + "High": 223.66, + "Low": 221.0, + "Close": 221.64 + }, + { + "Date": "2025-06-16", + "Open": 220.44, + "High": 224.6, + "Low": 217.53, + "Close": 221.15 + }, + { + "Date": "2025-06-17", + "Open": 223.78, + "High": 224.78, + "Low": 219.9, + "Close": 220.36 + }, + { + "Date": "2025-06-18", + "Open": 220.9, + "High": 224.65, + "Low": 220.56, + "Close": 220.67 + }, + { + "Date": "2025-06-19", + "Open": 222.72, + "High": 226.72, + "Low": 222.49, + "Close": 224.24 + }, + { + "Date": "2025-06-20", + "Open": 227.64, + "High": 231.94, + "Low": 223.7, + "Close": 228.93 + }, + { + "Date": "2025-06-23", + "Open": 224.53, + "High": 226.19, + "Low": 220.62, + "Close": 220.96 + }, + { + "Date": "2025-06-24", + "Open": 223.74, + "High": 228.12, + "Low": 222.5, + "Close": 222.54 + }, + { + "Date": "2025-06-25", + "Open": 221.04, + "High": 221.12, + "Low": 219.05, + "Close": 219.11 + }, + { + "Date": "2025-06-26", + "Open": 219.3, + "High": 223.46, + "Low": 217.06, + "Close": 217.25 + }, + { + "Date": "2025-06-27", + "Open": 219.77, + "High": 221.14, + "Low": 216.28, + "Close": 218.01 + }, + { + "Date": "2025-06-30", + "Open": 222.01, + "High": 223.18, + "Low": 217.87, + "Close": 222.27 + } +] \ No newline at end of file diff --git a/vue/src/ai-components/ai-chart/data/goog-data.json b/vue/src/ai-components/ai-chart/data/goog-data.json new file mode 100644 index 0000000..8020787 --- /dev/null +++ b/vue/src/ai-components/ai-chart/data/goog-data.json @@ -0,0 +1,1766 @@ +[ + { + "Date": "2024-07-01", + "Open": 182.76, + "High": 182.93, + "Low": 180.89, + "Close": 181.03 + }, + { + "Date": "2024-07-02", + "Open": 181.55, + "High": 183.05, + "Low": 180.46, + "Close": 182.3 + }, + { + "Date": "2024-07-03", + "Open": 183.21, + "High": 184.23, + "Low": 182.08, + "Close": 182.48 + }, + { + "Date": "2024-07-04", + "Open": 181.46, + "High": 182.33, + "Low": 181.17, + "Close": 182.01 + }, + { + "Date": "2024-07-05", + "Open": 182.45, + "High": 182.62, + "Low": 181.51, + "Close": 182.3 + }, + { + "Date": "2024-07-08", + "Open": 182.28, + "High": 183.21, + "Low": 180.64, + "Close": 183.18 + }, + { + "Date": "2024-07-09", + "Open": 183.77, + "High": 185.5, + "Low": 183.27, + "Close": 184.72 + }, + { + "Date": "2024-07-10", + "Open": 183.81, + "High": 184.51, + "Low": 183.24, + "Close": 183.37 + }, + { + "Date": "2024-07-11", + "Open": 182.33, + "High": 183.18, + "Low": 181.1, + "Close": 182.08 + }, + { + "Date": "2024-07-12", + "Open": 182.46, + "High": 183.11, + "Low": 182.01, + "Close": 182.93 + }, + { + "Date": "2024-07-15", + "Open": 181.92, + "High": 182.7, + "Low": 181.0, + "Close": 181.32 + }, + { + "Date": "2024-07-16", + "Open": 179.87, + "High": 181.27, + "Low": 178.86, + "Close": 180.89 + }, + { + "Date": "2024-07-17", + "Open": 180.69, + "High": 181.92, + "Low": 180.57, + "Close": 181.31 + }, + { + "Date": "2024-07-18", + "Open": 180.07, + "High": 181.29, + "Low": 178.68, + "Close": 179.83 + }, + { + "Date": "2024-07-19", + "Open": 179.95, + "High": 181.33, + "Low": 179.41, + "Close": 181.06 + }, + { + "Date": "2024-07-22", + "Open": 181.66, + "High": 183.16, + "Low": 180.45, + "Close": 180.69 + }, + { + "Date": "2024-07-23", + "Open": 179.54, + "High": 180.07, + "Low": 179.19, + "Close": 179.94 + }, + { + "Date": "2024-07-24", + "Open": 180.77, + "High": 180.95, + "Low": 179.69, + "Close": 180.68 + }, + { + "Date": "2024-07-25", + "Open": 182.07, + "High": 182.42, + "Low": 180.36, + "Close": 181.19 + }, + { + "Date": "2024-07-26", + "Open": 181.49, + "High": 182.47, + "Low": 180.38, + "Close": 180.55 + }, + { + "Date": "2024-07-29", + "Open": 179.17, + "High": 179.44, + "Low": 178.41, + "Close": 178.48 + }, + { + "Date": "2024-07-30", + "Open": 178.4, + "High": 178.58, + "Low": 177.48, + "Close": 178.49 + }, + { + "Date": "2024-07-31", + "Open": 179.36, + "High": 181.33, + "Low": 179.25, + "Close": 180.07 + }, + { + "Date": "2024-08-01", + "Open": 179.38, + "High": 179.68, + "Low": 177.78, + "Close": 178.19 + }, + { + "Date": "2024-08-02", + "Open": 179.54, + "High": 180.55, + "Low": 179.24, + "Close": 180.54 + }, + { + "Date": "2024-08-05", + "Open": 179.56, + "High": 179.71, + "Low": 179.21, + "Close": 179.48 + }, + { + "Date": "2024-08-06", + "Open": 180.14, + "High": 181.08, + "Low": 178.94, + "Close": 180.78 + }, + { + "Date": "2024-08-07", + "Open": 179.8, + "High": 181.44, + "Low": 177.88, + "Close": 180.21 + }, + { + "Date": "2024-08-08", + "Open": 178.72, + "High": 179.69, + "Low": 177.55, + "Close": 179.18 + }, + { + "Date": "2024-08-09", + "Open": 179.32, + "High": 180.65, + "Low": 179.02, + "Close": 180.6 + }, + { + "Date": "2024-08-12", + "Open": 181.35, + "High": 182.2, + "Low": 180.41, + "Close": 180.84 + }, + { + "Date": "2024-08-13", + "Open": 182.31, + "High": 184.13, + "Low": 180.81, + "Close": 180.82 + }, + { + "Date": "2024-08-14", + "Open": 181.88, + "High": 183.16, + "Low": 181.46, + "Close": 182.32 + }, + { + "Date": "2024-08-15", + "Open": 180.82, + "High": 182.16, + "Low": 179.01, + "Close": 181.79 + }, + { + "Date": "2024-08-16", + "Open": 182.04, + "High": 182.76, + "Low": 180.81, + "Close": 182.45 + }, + { + "Date": "2024-08-19", + "Open": 182.32, + "High": 184.01, + "Low": 181.31, + "Close": 182.04 + }, + { + "Date": "2024-08-20", + "Open": 181.98, + "High": 183.81, + "Low": 181.47, + "Close": 182.61 + }, + { + "Date": "2024-08-21", + "Open": 182.5, + "High": 184.25, + "Low": 181.96, + "Close": 182.09 + }, + { + "Date": "2024-08-22", + "Open": 182.61, + "High": 184.05, + "Low": 181.94, + "Close": 182.99 + }, + { + "Date": "2024-08-23", + "Open": 182.66, + "High": 182.88, + "Low": 182.39, + "Close": 182.7 + }, + { + "Date": "2024-08-26", + "Open": 183.55, + "High": 185.32, + "Low": 181.74, + "Close": 181.86 + }, + { + "Date": "2024-08-27", + "Open": 183.25, + "High": 184.56, + "Low": 181.28, + "Close": 183.05 + }, + { + "Date": "2024-08-28", + "Open": 181.75, + "High": 183.67, + "Low": 181.12, + "Close": 182.28 + }, + { + "Date": "2024-08-29", + "Open": 183.4, + "High": 184.53, + "Low": 181.8, + "Close": 182.69 + }, + { + "Date": "2024-08-30", + "Open": 183.24, + "High": 184.61, + "Low": 181.85, + "Close": 182.99 + }, + { + "Date": "2024-09-02", + "Open": 183.46, + "High": 185.46, + "Low": 182.49, + "Close": 183.47 + }, + { + "Date": "2024-09-03", + "Open": 182.47, + "High": 183.49, + "Low": 181.06, + "Close": 181.79 + }, + { + "Date": "2024-09-04", + "Open": 180.39, + "High": 181.93, + "Low": 179.37, + "Close": 181.74 + }, + { + "Date": "2024-09-05", + "Open": 182.33, + "High": 182.55, + "Low": 180.7, + "Close": 182.32 + }, + { + "Date": "2024-09-06", + "Open": 181.43, + "High": 182.24, + "Low": 179.63, + "Close": 179.85 + }, + { + "Date": "2024-09-09", + "Open": 180.11, + "High": 181.7, + "Low": 179.89, + "Close": 180.82 + }, + { + "Date": "2024-09-10", + "Open": 180.89, + "High": 181.72, + "Low": 179.72, + "Close": 180.47 + }, + { + "Date": "2024-09-11", + "Open": 179.11, + "High": 180.67, + "Low": 177.61, + "Close": 179.79 + }, + { + "Date": "2024-09-12", + "Open": 180.47, + "High": 181.77, + "Low": 179.81, + "Close": 181.56 + }, + { + "Date": "2024-09-13", + "Open": 180.58, + "High": 181.82, + "Low": 179.17, + "Close": 180.64 + }, + { + "Date": "2024-09-16", + "Open": 180.39, + "High": 182.2, + "Low": 179.07, + "Close": 180.01 + }, + { + "Date": "2024-09-17", + "Open": 180.64, + "High": 182.37, + "Low": 178.85, + "Close": 179.66 + }, + { + "Date": "2024-09-18", + "Open": 178.25, + "High": 179.98, + "Low": 176.72, + "Close": 178.9 + }, + { + "Date": "2024-09-19", + "Open": 177.58, + "High": 178.15, + "Low": 176.06, + "Close": 177.66 + }, + { + "Date": "2024-09-20", + "Open": 177.31, + "High": 178.49, + "Low": 176.84, + "Close": 177.81 + }, + { + "Date": "2024-09-23", + "Open": 178.8, + "High": 180.77, + "Low": 177.04, + "Close": 179.58 + }, + { + "Date": "2024-09-24", + "Open": 180.48, + "High": 182.28, + "Low": 179.7, + "Close": 181.32 + }, + { + "Date": "2024-09-25", + "Open": 182.04, + "High": 183.17, + "Low": 181.17, + "Close": 182.66 + }, + { + "Date": "2024-09-26", + "Open": 181.66, + "High": 182.08, + "Low": 180.64, + "Close": 181.79 + }, + { + "Date": "2024-09-27", + "Open": 181.88, + "High": 183.8, + "Low": 179.93, + "Close": 180.1 + }, + { + "Date": "2024-09-30", + "Open": 179.87, + "High": 180.15, + "Low": 178.31, + "Close": 179.02 + }, + { + "Date": "2024-10-01", + "Open": 178.74, + "High": 179.04, + "Low": 177.16, + "Close": 178.06 + }, + { + "Date": "2024-10-02", + "Open": 176.6, + "High": 177.13, + "Low": 175.72, + "Close": 176.24 + }, + { + "Date": "2024-10-03", + "Open": 176.42, + "High": 177.53, + "Low": 175.13, + "Close": 176.82 + }, + { + "Date": "2024-10-04", + "Open": 176.11, + "High": 176.24, + "Low": 174.34, + "Close": 175.98 + }, + { + "Date": "2024-10-07", + "Open": 176.93, + "High": 177.52, + "Low": 176.24, + "Close": 176.6 + }, + { + "Date": "2024-10-08", + "Open": 177.06, + "High": 178.91, + "Low": 176.88, + "Close": 178.1 + }, + { + "Date": "2024-10-09", + "Open": 177.53, + "High": 177.69, + "Low": 177.23, + "Close": 177.47 + }, + { + "Date": "2024-10-10", + "Open": 178.81, + "High": 179.42, + "Low": 177.33, + "Close": 178.27 + }, + { + "Date": "2024-10-11", + "Open": 178.7, + "High": 180.63, + "Low": 177.07, + "Close": 180.04 + }, + { + "Date": "2024-10-14", + "Open": 181.24, + "High": 182.38, + "Low": 179.84, + "Close": 180.09 + }, + { + "Date": "2024-10-15", + "Open": 181.43, + "High": 181.95, + "Low": 180.64, + "Close": 181.36 + }, + { + "Date": "2024-10-16", + "Open": 182.64, + "High": 183.53, + "Low": 181.74, + "Close": 183.03 + }, + { + "Date": "2024-10-17", + "Open": 183.87, + "High": 184.1, + "Low": 183.64, + "Close": 183.67 + }, + { + "Date": "2024-10-18", + "Open": 184.55, + "High": 185.66, + "Low": 183.57, + "Close": 184.99 + }, + { + "Date": "2024-10-21", + "Open": 184.97, + "High": 186.91, + "Low": 184.38, + "Close": 184.87 + }, + { + "Date": "2024-10-22", + "Open": 185.59, + "High": 187.25, + "Low": 185.11, + "Close": 187.13 + }, + { + "Date": "2024-10-23", + "Open": 188.39, + "High": 189.05, + "Low": 187.91, + "Close": 188.13 + }, + { + "Date": "2024-10-24", + "Open": 186.99, + "High": 188.52, + "Low": 185.59, + "Close": 186.56 + }, + { + "Date": "2024-10-25", + "Open": 185.86, + "High": 186.6, + "Low": 184.37, + "Close": 184.78 + }, + { + "Date": "2024-10-28", + "Open": 184.55, + "High": 185.28, + "Low": 184.36, + "Close": 185.15 + }, + { + "Date": "2024-10-29", + "Open": 186.11, + "High": 186.6, + "Low": 185.37, + "Close": 186.26 + }, + { + "Date": "2024-10-30", + "Open": 187.5, + "High": 188.25, + "Low": 186.65, + "Close": 187.99 + }, + { + "Date": "2024-10-31", + "Open": 186.58, + "High": 187.79, + "Low": 185.11, + "Close": 186.28 + }, + { + "Date": "2024-11-01", + "Open": 187.29, + "High": 188.14, + "Low": 185.36, + "Close": 186.37 + }, + { + "Date": "2024-11-04", + "Open": 185.49, + "High": 186.18, + "Low": 183.88, + "Close": 185.86 + }, + { + "Date": "2024-11-05", + "Open": 186.0, + "High": 187.18, + "Low": 185.75, + "Close": 186.18 + }, + { + "Date": "2024-11-06", + "Open": 186.47, + "High": 188.35, + "Low": 185.97, + "Close": 186.04 + }, + { + "Date": "2024-11-07", + "Open": 185.9, + "High": 187.46, + "Low": 184.28, + "Close": 186.14 + }, + { + "Date": "2024-11-08", + "Open": 185.14, + "High": 185.58, + "Low": 184.41, + "Close": 185.02 + }, + { + "Date": "2024-11-11", + "Open": 183.57, + "High": 184.98, + "Low": 183.22, + "Close": 184.67 + }, + { + "Date": "2024-11-12", + "Open": 185.93, + "High": 186.79, + "Low": 184.41, + "Close": 185.88 + }, + { + "Date": "2024-11-13", + "Open": 187.22, + "High": 187.72, + "Low": 187.02, + "Close": 187.56 + }, + { + "Date": "2024-11-14", + "Open": 187.66, + "High": 189.41, + "Low": 185.97, + "Close": 186.45 + }, + { + "Date": "2024-11-15", + "Open": 185.0, + "High": 186.21, + "Low": 184.75, + "Close": 185.03 + }, + { + "Date": "2024-11-18", + "Open": 184.09, + "High": 184.97, + "Low": 182.75, + "Close": 183.55 + }, + { + "Date": "2024-11-19", + "Open": 182.84, + "High": 183.95, + "Low": 181.32, + "Close": 183.38 + }, + { + "Date": "2024-11-20", + "Open": 182.19, + "High": 183.31, + "Low": 182.06, + "Close": 183.16 + }, + { + "Date": "2024-11-21", + "Open": 183.52, + "High": 184.02, + "Low": 181.93, + "Close": 183.31 + }, + { + "Date": "2024-11-22", + "Open": 184.65, + "High": 186.2, + "Low": 183.88, + "Close": 184.26 + }, + { + "Date": "2024-11-25", + "Open": 184.54, + "High": 184.94, + "Low": 184.42, + "Close": 184.86 + }, + { + "Date": "2024-11-26", + "Open": 185.82, + "High": 187.13, + "Low": 184.93, + "Close": 186.04 + }, + { + "Date": "2024-11-27", + "Open": 186.59, + "High": 188.51, + "Low": 184.65, + "Close": 187.8 + }, + { + "Date": "2024-11-28", + "Open": 187.69, + "High": 189.66, + "Low": 186.96, + "Close": 188.79 + }, + { + "Date": "2024-11-29", + "Open": 190.0, + "High": 190.96, + "Low": 188.47, + "Close": 189.71 + }, + { + "Date": "2024-12-02", + "Open": 188.23, + "High": 189.55, + "Low": 187.21, + "Close": 187.87 + }, + { + "Date": "2024-12-03", + "Open": 187.11, + "High": 188.3, + "Low": 185.48, + "Close": 188.18 + }, + { + "Date": "2024-12-04", + "Open": 188.78, + "High": 189.88, + "Low": 187.21, + "Close": 189.69 + }, + { + "Date": "2024-12-05", + "Open": 190.77, + "High": 192.17, + "Low": 189.11, + "Close": 191.24 + }, + { + "Date": "2024-12-06", + "Open": 190.11, + "High": 190.81, + "Low": 188.68, + "Close": 189.15 + }, + { + "Date": "2024-12-09", + "Open": 189.16, + "High": 189.48, + "Low": 188.61, + "Close": 189.31 + }, + { + "Date": "2024-12-10", + "Open": 189.42, + "High": 190.84, + "Low": 187.53, + "Close": 188.73 + }, + { + "Date": "2024-12-11", + "Open": 188.93, + "High": 190.37, + "Low": 187.84, + "Close": 188.13 + }, + { + "Date": "2024-12-12", + "Open": 187.05, + "High": 188.09, + "Low": 185.88, + "Close": 186.9 + }, + { + "Date": "2024-12-13", + "Open": 185.67, + "High": 186.75, + "Low": 184.62, + "Close": 186.64 + }, + { + "Date": "2024-12-16", + "Open": 186.76, + "High": 187.47, + "Low": 185.74, + "Close": 187.11 + }, + { + "Date": "2024-12-17", + "Open": 186.07, + "High": 187.55, + "Low": 184.12, + "Close": 187.52 + }, + { + "Date": "2024-12-18", + "Open": 187.59, + "High": 188.3, + "Low": 186.18, + "Close": 188.09 + }, + { + "Date": "2024-12-19", + "Open": 189.25, + "High": 190.13, + "Low": 188.69, + "Close": 189.03 + }, + { + "Date": "2024-12-20", + "Open": 187.91, + "High": 188.24, + "Low": 186.3, + "Close": 186.5 + }, + { + "Date": "2024-12-23", + "Open": 185.52, + "High": 187.42, + "Low": 184.88, + "Close": 186.85 + }, + { + "Date": "2024-12-24", + "Open": 185.49, + "High": 186.04, + "Low": 184.3, + "Close": 184.78 + }, + { + "Date": "2024-12-25", + "Open": 184.98, + "High": 186.0, + "Low": 183.72, + "Close": 184.27 + }, + { + "Date": "2024-12-26", + "Open": 185.23, + "High": 185.76, + "Low": 184.48, + "Close": 185.58 + }, + { + "Date": "2024-12-27", + "Open": 184.76, + "High": 185.69, + "Low": 183.19, + "Close": 183.96 + }, + { + "Date": "2024-12-30", + "Open": 183.31, + "High": 184.85, + "Low": 182.97, + "Close": 183.74 + }, + { + "Date": "2024-12-31", + "Open": 185.14, + "High": 186.61, + "Low": 184.77, + "Close": 185.68 + }, + { + "Date": "2025-01-01", + "Open": 184.42, + "High": 185.4, + "Low": 182.54, + "Close": 183.3 + }, + { + "Date": "2025-01-02", + "Open": 182.67, + "High": 184.46, + "Low": 181.97, + "Close": 183.53 + }, + { + "Date": "2025-01-03", + "Open": 184.96, + "High": 185.16, + "Low": 184.64, + "Close": 185.14 + }, + { + "Date": "2025-01-06", + "Open": 184.6, + "High": 185.47, + "Low": 183.36, + "Close": 185.45 + }, + { + "Date": "2025-01-07", + "Open": 184.05, + "High": 184.63, + "Low": 182.7, + "Close": 184.07 + }, + { + "Date": "2025-01-08", + "Open": 184.48, + "High": 184.68, + "Low": 183.96, + "Close": 184.03 + }, + { + "Date": "2025-01-09", + "Open": 185.22, + "High": 185.44, + "Low": 183.62, + "Close": 184.39 + }, + { + "Date": "2025-01-10", + "Open": 183.46, + "High": 183.62, + "Low": 182.59, + "Close": 182.87 + }, + { + "Date": "2025-01-13", + "Open": 183.98, + "High": 184.83, + "Low": 183.06, + "Close": 184.5 + }, + { + "Date": "2025-01-14", + "Open": 183.93, + "High": 184.31, + "Low": 183.74, + "Close": 184.14 + }, + { + "Date": "2025-01-15", + "Open": 182.97, + "High": 184.23, + "Low": 182.03, + "Close": 183.05 + }, + { + "Date": "2025-01-16", + "Open": 183.7, + "High": 184.46, + "Low": 183.5, + "Close": 183.57 + }, + { + "Date": "2025-01-17", + "Open": 182.76, + "High": 184.69, + "Low": 182.0, + "Close": 184.4 + }, + { + "Date": "2025-01-20", + "Open": 184.63, + "High": 186.41, + "Low": 183.01, + "Close": 183.91 + }, + { + "Date": "2025-01-21", + "Open": 184.32, + "High": 185.36, + "Low": 182.86, + "Close": 183.6 + }, + { + "Date": "2025-01-22", + "Open": 182.94, + "High": 184.4, + "Low": 182.79, + "Close": 183.05 + }, + { + "Date": "2025-01-23", + "Open": 184.13, + "High": 186.0, + "Low": 182.77, + "Close": 183.77 + }, + { + "Date": "2025-01-24", + "Open": 182.45, + "High": 183.33, + "Low": 181.75, + "Close": 183.05 + }, + { + "Date": "2025-01-27", + "Open": 182.14, + "High": 183.1, + "Low": 181.75, + "Close": 182.49 + }, + { + "Date": "2025-01-28", + "Open": 181.43, + "High": 182.17, + "Low": 181.1, + "Close": 181.17 + }, + { + "Date": "2025-01-29", + "Open": 180.34, + "High": 181.02, + "Low": 179.78, + "Close": 180.87 + }, + { + "Date": "2025-01-30", + "Open": 180.27, + "High": 181.21, + "Low": 178.44, + "Close": 180.24 + }, + { + "Date": "2025-01-31", + "Open": 180.62, + "High": 182.53, + "Low": 179.72, + "Close": 181.02 + }, + { + "Date": "2025-02-03", + "Open": 180.48, + "High": 182.1, + "Low": 178.82, + "Close": 179.33 + }, + { + "Date": "2025-02-04", + "Open": 180.41, + "High": 180.6, + "Low": 179.28, + "Close": 179.8 + }, + { + "Date": "2025-02-05", + "Open": 180.85, + "High": 182.13, + "Low": 179.1, + "Close": 181.27 + }, + { + "Date": "2025-02-06", + "Open": 180.22, + "High": 181.29, + "Low": 178.28, + "Close": 178.73 + }, + { + "Date": "2025-02-07", + "Open": 178.17, + "High": 178.62, + "Low": 176.75, + "Close": 177.76 + }, + { + "Date": "2025-02-10", + "Open": 178.0, + "High": 178.79, + "Low": 176.36, + "Close": 178.58 + }, + { + "Date": "2025-02-11", + "Open": 177.4, + "High": 177.75, + "Low": 175.89, + "Close": 177.55 + }, + { + "Date": "2025-02-12", + "Open": 176.08, + "High": 176.38, + "Low": 174.73, + "Close": 174.94 + }, + { + "Date": "2025-02-13", + "Open": 176.36, + "High": 176.88, + "Low": 174.88, + "Close": 175.86 + }, + { + "Date": "2025-02-14", + "Open": 175.05, + "High": 176.79, + "Low": 174.39, + "Close": 175.81 + }, + { + "Date": "2025-02-17", + "Open": 174.91, + "High": 176.7, + "Low": 174.28, + "Close": 175.54 + }, + { + "Date": "2025-02-18", + "Open": 175.38, + "High": 176.73, + "Low": 174.44, + "Close": 174.73 + }, + { + "Date": "2025-02-19", + "Open": 174.36, + "High": 175.48, + "Low": 172.79, + "Close": 174.17 + }, + { + "Date": "2025-02-20", + "Open": 173.46, + "High": 173.83, + "Low": 172.1, + "Close": 172.75 + }, + { + "Date": "2025-02-21", + "Open": 172.46, + "High": 173.11, + "Low": 171.23, + "Close": 172.68 + }, + { + "Date": "2025-02-24", + "Open": 171.42, + "High": 171.87, + "Low": 169.51, + "Close": 170.55 + }, + { + "Date": "2025-02-25", + "Open": 169.72, + "High": 171.57, + "Low": 168.09, + "Close": 170.72 + }, + { + "Date": "2025-02-26", + "Open": 171.15, + "High": 172.25, + "Low": 169.73, + "Close": 172.19 + }, + { + "Date": "2025-02-27", + "Open": 171.46, + "High": 173.1, + "Low": 170.34, + "Close": 170.54 + }, + { + "Date": "2025-02-28", + "Open": 169.55, + "High": 169.82, + "Low": 167.91, + "Close": 168.12 + }, + { + "Date": "2025-03-03", + "Open": 167.68, + "High": 168.04, + "Low": 166.8, + "Close": 167.91 + }, + { + "Date": "2025-03-04", + "Open": 168.45, + "High": 168.94, + "Low": 168.28, + "Close": 168.66 + }, + { + "Date": "2025-03-05", + "Open": 169.21, + "High": 170.15, + "Low": 168.76, + "Close": 168.99 + }, + { + "Date": "2025-03-06", + "Open": 167.65, + "High": 167.76, + "Low": 166.61, + "Close": 167.06 + }, + { + "Date": "2025-03-07", + "Open": 166.73, + "High": 167.7, + "Low": 165.43, + "Close": 166.0 + }, + { + "Date": "2025-03-10", + "Open": 165.87, + "High": 167.24, + "Low": 165.39, + "Close": 167.12 + }, + { + "Date": "2025-03-11", + "Open": 168.44, + "High": 170.25, + "Low": 166.69, + "Close": 167.19 + }, + { + "Date": "2025-03-12", + "Open": 168.52, + "High": 169.66, + "Low": 167.15, + "Close": 168.58 + }, + { + "Date": "2025-03-13", + "Open": 168.74, + "High": 170.55, + "Low": 168.1, + "Close": 168.54 + }, + { + "Date": "2025-03-14", + "Open": 168.37, + "High": 169.58, + "Low": 167.88, + "Close": 168.97 + }, + { + "Date": "2025-03-17", + "Open": 170.32, + "High": 171.27, + "Low": 169.63, + "Close": 170.58 + }, + { + "Date": "2025-03-18", + "Open": 169.88, + "High": 170.62, + "Low": 169.23, + "Close": 169.37 + }, + { + "Date": "2025-03-19", + "Open": 170.32, + "High": 170.62, + "Low": 169.27, + "Close": 169.43 + }, + { + "Date": "2025-03-20", + "Open": 170.76, + "High": 171.12, + "Low": 169.08, + "Close": 170.27 + }, + { + "Date": "2025-03-21", + "Open": 171.13, + "High": 171.41, + "Low": 169.93, + "Close": 171.19 + }, + { + "Date": "2025-03-24", + "Open": 170.54, + "High": 171.13, + "Low": 169.5, + "Close": 170.76 + }, + { + "Date": "2025-03-25", + "Open": 169.98, + "High": 171.84, + "Low": 169.68, + "Close": 170.44 + }, + { + "Date": "2025-03-26", + "Open": 169.27, + "High": 170.28, + "Low": 168.47, + "Close": 170.02 + }, + { + "Date": "2025-03-27", + "Open": 170.6, + "High": 171.65, + "Low": 168.82, + "Close": 169.69 + }, + { + "Date": "2025-03-28", + "Open": 169.68, + "High": 171.36, + "Low": 167.75, + "Close": 169.72 + }, + { + "Date": "2025-03-31", + "Open": 168.65, + "High": 170.29, + "Low": 167.51, + "Close": 168.64 + }, + { + "Date": "2025-04-01", + "Open": 170.01, + "High": 170.38, + "Low": 169.9, + "Close": 170.29 + }, + { + "Date": "2025-04-02", + "Open": 171.5, + "High": 172.67, + "Low": 169.56, + "Close": 169.76 + }, + { + "Date": "2025-04-03", + "Open": 170.16, + "High": 170.69, + "Low": 168.29, + "Close": 170.5 + }, + { + "Date": "2025-04-04", + "Open": 170.25, + "High": 170.66, + "Low": 168.44, + "Close": 169.83 + }, + { + "Date": "2025-04-07", + "Open": 168.54, + "High": 169.76, + "Low": 166.66, + "Close": 167.64 + }, + { + "Date": "2025-04-08", + "Open": 167.16, + "High": 168.22, + "Low": 166.25, + "Close": 167.83 + }, + { + "Date": "2025-04-09", + "Open": 168.03, + "High": 168.33, + "Low": 167.79, + "Close": 167.94 + }, + { + "Date": "2025-04-10", + "Open": 169.09, + "High": 169.48, + "Low": 168.1, + "Close": 168.37 + }, + { + "Date": "2025-04-11", + "Open": 168.61, + "High": 168.97, + "Low": 167.83, + "Close": 168.61 + }, + { + "Date": "2025-04-14", + "Open": 169.97, + "High": 171.12, + "Low": 169.49, + "Close": 169.86 + }, + { + "Date": "2025-04-15", + "Open": 169.2, + "High": 170.0, + "Low": 167.33, + "Close": 168.28 + }, + { + "Date": "2025-04-16", + "Open": 168.12, + "High": 170.12, + "Low": 167.23, + "Close": 169.19 + }, + { + "Date": "2025-04-17", + "Open": 168.6, + "High": 169.43, + "Low": 167.44, + "Close": 168.29 + }, + { + "Date": "2025-04-18", + "Open": 168.94, + "High": 170.82, + "Low": 167.65, + "Close": 169.73 + }, + { + "Date": "2025-04-21", + "Open": 169.61, + "High": 170.29, + "Low": 168.66, + "Close": 169.85 + }, + { + "Date": "2025-04-22", + "Open": 170.37, + "High": 170.86, + "Low": 170.09, + "Close": 170.32 + }, + { + "Date": "2025-04-23", + "Open": 170.64, + "High": 170.96, + "Low": 169.44, + "Close": 169.65 + }, + { + "Date": "2025-04-24", + "Open": 168.62, + "High": 169.46, + "Low": 168.34, + "Close": 168.8 + }, + { + "Date": "2025-04-25", + "Open": 167.44, + "High": 167.82, + "Low": 165.81, + "Close": 166.25 + }, + { + "Date": "2025-04-28", + "Open": 165.72, + "High": 166.3, + "Low": 164.27, + "Close": 165.25 + }, + { + "Date": "2025-04-29", + "Open": 166.09, + "High": 167.47, + "Low": 164.77, + "Close": 166.96 + }, + { + "Date": "2025-04-30", + "Open": 166.06, + "High": 166.82, + "Low": 164.11, + "Close": 166.76 + }, + { + "Date": "2025-05-01", + "Open": 166.67, + "High": 168.42, + "Low": 164.95, + "Close": 165.04 + }, + { + "Date": "2025-05-02", + "Open": 163.83, + "High": 165.01, + "Low": 163.58, + "Close": 164.78 + }, + { + "Date": "2025-05-05", + "Open": 165.68, + "High": 166.42, + "Low": 164.25, + "Close": 166.03 + }, + { + "Date": "2025-05-06", + "Open": 164.97, + "High": 166.45, + "Low": 164.22, + "Close": 165.75 + }, + { + "Date": "2025-05-07", + "Open": 166.37, + "High": 167.26, + "Low": 165.77, + "Close": 166.69 + }, + { + "Date": "2025-05-08", + "Open": 165.5, + "High": 166.22, + "Low": 165.03, + "Close": 165.03 + }, + { + "Date": "2025-05-09", + "Open": 163.6, + "High": 163.74, + "Low": 162.1, + "Close": 162.41 + }, + { + "Date": "2025-05-12", + "Open": 161.51, + "High": 161.87, + "Low": 160.77, + "Close": 161.12 + }, + { + "Date": "2025-05-13", + "Open": 160.2, + "High": 160.65, + "Low": 159.1, + "Close": 160.22 + }, + { + "Date": "2025-05-14", + "Open": 161.25, + "High": 162.03, + "Low": 159.96, + "Close": 160.24 + }, + { + "Date": "2025-05-15", + "Open": 160.22, + "High": 160.62, + "Low": 158.41, + "Close": 160.23 + }, + { + "Date": "2025-05-16", + "Open": 159.65, + "High": 159.81, + "Low": 158.72, + "Close": 159.06 + }, + { + "Date": "2025-05-19", + "Open": 159.21, + "High": 159.8, + "Low": 159.03, + "Close": 159.59 + }, + { + "Date": "2025-05-20", + "Open": 159.37, + "High": 160.79, + "Low": 158.58, + "Close": 159.82 + }, + { + "Date": "2025-05-21", + "Open": 161.05, + "High": 162.95, + "Low": 159.44, + "Close": 161.81 + }, + { + "Date": "2025-05-22", + "Open": 162.62, + "High": 163.48, + "Low": 161.0, + "Close": 161.56 + }, + { + "Date": "2025-05-23", + "Open": 160.74, + "High": 161.34, + "Low": 160.34, + "Close": 160.58 + }, + { + "Date": "2025-05-26", + "Open": 160.4, + "High": 161.4, + "Low": 159.11, + "Close": 159.51 + }, + { + "Date": "2025-05-27", + "Open": 158.12, + "High": 159.57, + "Low": 156.54, + "Close": 157.8 + }, + { + "Date": "2025-05-28", + "Open": 158.21, + "High": 158.4, + "Low": 157.2, + "Close": 157.28 + }, + { + "Date": "2025-05-29", + "Open": 157.63, + "High": 158.39, + "Low": 157.0, + "Close": 158.02 + }, + { + "Date": "2025-05-30", + "Open": 158.64, + "High": 158.88, + "Low": 158.23, + "Close": 158.32 + }, + { + "Date": "2025-06-02", + "Open": 157.06, + "High": 158.06, + "Low": 155.14, + "Close": 155.46 + }, + { + "Date": "2025-06-03", + "Open": 154.59, + "High": 154.8, + "Low": 153.1, + "Close": 154.46 + }, + { + "Date": "2025-06-04", + "Open": 153.0, + "High": 154.63, + "Low": 152.45, + "Close": 153.32 + }, + { + "Date": "2025-06-05", + "Open": 153.08, + "High": 154.63, + "Low": 151.71, + "Close": 153.65 + }, + { + "Date": "2025-06-06", + "Open": 154.77, + "High": 155.87, + "Low": 152.78, + "Close": 155.64 + }, + { + "Date": "2025-06-09", + "Open": 156.92, + "High": 157.31, + "Low": 154.93, + "Close": 154.93 + }, + { + "Date": "2025-06-10", + "Open": 155.23, + "High": 155.88, + "Low": 155.11, + "Close": 155.14 + }, + { + "Date": "2025-06-11", + "Open": 155.76, + "High": 156.46, + "Low": 155.26, + "Close": 156.04 + }, + { + "Date": "2025-06-12", + "Open": 154.9, + "High": 156.28, + "Low": 154.31, + "Close": 154.74 + }, + { + "Date": "2025-06-13", + "Open": 153.53, + "High": 155.1, + "Low": 151.9, + "Close": 152.24 + }, + { + "Date": "2025-06-16", + "Open": 153.29, + "High": 155.19, + "Low": 151.43, + "Close": 154.65 + }, + { + "Date": "2025-06-17", + "Open": 154.22, + "High": 155.39, + "Low": 152.76, + "Close": 152.83 + } +] \ No newline at end of file diff --git a/vue/src/ai-components/ai-chart/data/msft-data.json b/vue/src/ai-components/ai-chart/data/msft-data.json new file mode 100644 index 0000000..df9e7d5 --- /dev/null +++ b/vue/src/ai-components/ai-chart/data/msft-data.json @@ -0,0 +1,2250 @@ +[ + { + "date": "2024-06-03", + "open": 128.65, + "high": 129.66, + "low": 128.35, + "close": 129.24, + "volume": 17862294 + }, + { + "date": "2024-06-04", + "open": 130.53, + "high": 131.76, + "low": 129.24, + "close": 129.83, + "volume": 24622730 + }, + { + "date": "2024-06-05", + "open": 130.91, + "high": 132.21, + "low": 130.08, + "close": 130.74, + "volume": 25324954 + }, + { + "date": "2024-06-06", + "open": 131.34, + "high": 132.23, + "low": 128.97, + "close": 130.0, + "volume": 23487603 + }, + { + "date": "2024-06-07", + "open": 130.56, + "high": 131.17, + "low": 128.8, + "close": 129.5, + "volume": 34692706 + }, + { + "date": "2024-06-10", + "open": 128.47, + "high": 129.87, + "low": 127.16, + "close": 127.4, + "volume": 32653028 + }, + { + "date": "2024-06-11", + "open": 128.07, + "high": 129.44, + "low": 126.32, + "close": 126.32, + "volume": 32027251 + }, + { + "date": "2024-06-12", + "open": 124.48, + "high": 124.66, + "low": 123.33, + "close": 123.67, + "volume": 34268108 + }, + { + "date": "2024-06-13", + "open": 123.91, + "high": 125.58, + "low": 123.75, + "close": 124.29, + "volume": 23048223 + }, + { + "date": "2024-06-14", + "open": 124.78, + "high": 126.13, + "low": 123.45, + "close": 125.31, + "volume": 23055870 + }, + { + "date": "2024-06-17", + "open": 124.45, + "high": 125.68, + "low": 123.59, + "close": 124.71, + "volume": 29045496 + }, + { + "date": "2024-06-18", + "open": 126.08, + "high": 127.11, + "low": 125.33, + "close": 126.28, + "volume": 26792047 + }, + { + "date": "2024-06-19", + "open": 125.73, + "high": 126.56, + "low": 124.7, + "close": 124.85, + "volume": 21305157 + }, + { + "date": "2024-06-20", + "open": 123.77, + "high": 125.62, + "low": 122.49, + "close": 124.35, + "volume": 19580719 + }, + { + "date": "2024-06-21", + "open": 125.51, + "high": 126.96, + "low": 125.01, + "close": 125.75, + "volume": 24613573 + }, + { + "date": "2024-06-24", + "open": 125.12, + "high": 127.23, + "low": 123.74, + "close": 127.04, + "volume": 32520284 + }, + { + "date": "2024-06-25", + "open": 128.39, + "high": 129.29, + "low": 127.41, + "close": 128.85, + "volume": 18300998 + }, + { + "date": "2024-06-26", + "open": 129.78, + "high": 132.32, + "low": 128.59, + "close": 131.14, + "volume": 26021558 + }, + { + "date": "2024-06-27", + "open": 132.42, + "high": 134.6, + "low": 131.22, + "close": 134.17, + "volume": 33118380 + }, + { + "date": "2024-06-28", + "open": 135.82, + "high": 135.95, + "low": 134.44, + "close": 135.04, + "volume": 20578150 + }, + { + "date": "2024-07-01", + "open": 134.78, + "high": 135.83, + "low": 134.04, + "close": 135.33, + "volume": 29493376 + }, + { + "date": "2024-07-02", + "open": 135.09, + "high": 136.51, + "low": 134.41, + "close": 136.39, + "volume": 33915486 + }, + { + "date": "2024-07-03", + "open": 136.24, + "high": 137.11, + "low": 134.64, + "close": 135.68, + "volume": 15498134 + }, + { + "date": "2024-07-04", + "open": 135.49, + "high": 137.8, + "low": 134.09, + "close": 136.7, + "volume": 33539877 + }, + { + "date": "2024-07-05", + "open": 137.13, + "high": 138.05, + "low": 135.93, + "close": 136.53, + "volume": 33779876 + }, + { + "date": "2024-07-08", + "open": 135.49, + "high": 137.61, + "low": 134.21, + "close": 136.26, + "volume": 23678455 + }, + { + "date": "2024-07-09", + "open": 135.48, + "high": 136.69, + "low": 135.35, + "close": 136.05, + "volume": 21438913 + }, + { + "date": "2024-07-10", + "open": 136.39, + "high": 137.98, + "low": 135.28, + "close": 137.87, + "volume": 31211658 + }, + { + "date": "2024-07-11", + "open": 137.74, + "high": 140.42, + "low": 137.3, + "close": 139.13, + "volume": 24963524 + }, + { + "date": "2024-07-12", + "open": 139.14, + "high": 140.05, + "low": 136.58, + "close": 137.73, + "volume": 25765620 + }, + { + "date": "2024-07-15", + "open": 137.12, + "high": 137.81, + "low": 135.58, + "close": 135.96, + "volume": 15243350 + }, + { + "date": "2024-07-16", + "open": 137.53, + "high": 137.96, + "low": 134.8, + "close": 135.81, + "volume": 25110655 + }, + { + "date": "2024-07-17", + "open": 135.83, + "high": 138.44, + "low": 134.58, + "close": 137.81, + "volume": 15002463 + }, + { + "date": "2024-07-18", + "open": 139.28, + "high": 140.36, + "low": 137.94, + "close": 139.22, + "volume": 30749505 + }, + { + "date": "2024-07-19", + "open": 139.27, + "high": 140.22, + "low": 137.99, + "close": 139.55, + "volume": 34672175 + }, + { + "date": "2024-07-22", + "open": 138.07, + "high": 138.74, + "low": 135.44, + "close": 136.94, + "volume": 17070231 + }, + { + "date": "2024-07-23", + "open": 137.43, + "high": 138.4, + "low": 136.15, + "close": 138.22, + "volume": 21556726 + }, + { + "date": "2024-07-24", + "open": 138.36, + "high": 139.84, + "low": 136.77, + "close": 137.04, + "volume": 30374245 + }, + { + "date": "2024-07-25", + "open": 138.54, + "high": 141.77, + "low": 137.14, + "close": 140.43, + "volume": 27146889 + }, + { + "date": "2024-07-26", + "open": 141.2, + "high": 143.4, + "low": 140.96, + "close": 142.61, + "volume": 29767082 + }, + { + "date": "2024-07-29", + "open": 140.98, + "high": 142.11, + "low": 139.93, + "close": 141.84, + "volume": 28548940 + }, + { + "date": "2024-07-30", + "open": 140.09, + "high": 141.54, + "low": 137.37, + "close": 138.83, + "volume": 19603793 + }, + { + "date": "2024-07-31", + "open": 138.79, + "high": 142.01, + "low": 137.49, + "close": 140.58, + "volume": 32595609 + }, + { + "date": "2024-08-01", + "open": 140.12, + "high": 140.35, + "low": 139.36, + "close": 139.82, + "volume": 30833184 + }, + { + "date": "2024-08-02", + "open": 138.98, + "high": 139.61, + "low": 138.14, + "close": 138.7, + "volume": 34637773 + }, + { + "date": "2024-08-05", + "open": 137.61, + "high": 138.24, + "low": 136.56, + "close": 137.84, + "volume": 20616414 + }, + { + "date": "2024-08-06", + "open": 136.82, + "high": 138.22, + "low": 135.37, + "close": 138.14, + "volume": 26759990 + }, + { + "date": "2024-08-07", + "open": 137.44, + "high": 139.99, + "low": 136.35, + "close": 139.1, + "volume": 31323601 + }, + { + "date": "2024-08-08", + "open": 139.76, + "high": 141.58, + "low": 138.38, + "close": 140.27, + "volume": 17379822 + }, + { + "date": "2024-08-09", + "open": 141.32, + "high": 144.67, + "low": 139.83, + "close": 143.2, + "volume": 24804819 + }, + { + "date": "2024-08-12", + "open": 142.24, + "high": 145.09, + "low": 141.74, + "close": 144.16, + "volume": 26169440 + }, + { + "date": "2024-08-13", + "open": 142.75, + "high": 143.45, + "low": 142.5, + "close": 142.78, + "volume": 21468022 + }, + { + "date": "2024-08-14", + "open": 142.17, + "high": 142.58, + "low": 141.09, + "close": 141.42, + "volume": 20561453 + }, + { + "date": "2024-08-15", + "open": 140.54, + "high": 140.85, + "low": 138.74, + "close": 139.35, + "volume": 20312759 + }, + { + "date": "2024-08-16", + "open": 140.28, + "high": 140.94, + "low": 139.13, + "close": 140.36, + "volume": 29188629 + }, + { + "date": "2024-08-19", + "open": 141.79, + "high": 142.96, + "low": 141.19, + "close": 142.33, + "volume": 17162676 + }, + { + "date": "2024-08-20", + "open": 141.37, + "high": 142.64, + "low": 140.15, + "close": 141.8, + "volume": 21685590 + }, + { + "date": "2024-08-21", + "open": 143.3, + "high": 143.93, + "low": 140.13, + "close": 141.51, + "volume": 34902453 + }, + { + "date": "2024-08-22", + "open": 140.72, + "high": 143.22, + "low": 139.63, + "close": 142.52, + "volume": 20215861 + }, + { + "date": "2024-08-23", + "open": 140.87, + "high": 142.2, + "low": 139.23, + "close": 140.42, + "volume": 16901066 + }, + { + "date": "2024-08-26", + "open": 142.05, + "high": 143.41, + "low": 139.14, + "close": 140.36, + "volume": 15455830 + }, + { + "date": "2024-08-27", + "open": 141.93, + "high": 143.02, + "low": 139.44, + "close": 140.82, + "volume": 29134729 + }, + { + "date": "2024-08-28", + "open": 141.0, + "high": 142.24, + "low": 139.81, + "close": 141.37, + "volume": 18931084 + }, + { + "date": "2024-08-29", + "open": 143.15, + "high": 143.97, + "low": 142.06, + "close": 143.67, + "volume": 26983909 + }, + { + "date": "2024-08-30", + "open": 143.51, + "high": 144.39, + "low": 142.17, + "close": 143.85, + "volume": 27470681 + }, + { + "date": "2024-09-02", + "open": 143.95, + "high": 145.3, + "low": 143.21, + "close": 144.99, + "volume": 16377021 + }, + { + "date": "2024-09-03", + "open": 143.48, + "high": 144.1, + "low": 143.21, + "close": 143.48, + "volume": 30114642 + }, + { + "date": "2024-09-04", + "open": 143.24, + "high": 143.89, + "low": 141.98, + "close": 143.08, + "volume": 15951636 + }, + { + "date": "2024-09-05", + "open": 143.07, + "high": 143.68, + "low": 140.68, + "close": 141.52, + "volume": 18956749 + }, + { + "date": "2024-09-06", + "open": 139.95, + "high": 141.71, + "low": 138.73, + "close": 141.05, + "volume": 20778573 + }, + { + "date": "2024-09-09", + "open": 140.99, + "high": 142.3, + "low": 139.66, + "close": 141.29, + "volume": 18880515 + }, + { + "date": "2024-09-10", + "open": 139.86, + "high": 141.22, + "low": 136.91, + "close": 138.09, + "volume": 33889288 + }, + { + "date": "2024-09-11", + "open": 137.93, + "high": 139.25, + "low": 137.0, + "close": 138.25, + "volume": 34617435 + }, + { + "date": "2024-09-12", + "open": 139.23, + "high": 140.95, + "low": 139.21, + "close": 140.26, + "volume": 32973215 + }, + { + "date": "2024-09-13", + "open": 139.43, + "high": 140.79, + "low": 136.74, + "close": 137.8, + "volume": 17343332 + }, + { + "date": "2024-09-16", + "open": 136.03, + "high": 136.07, + "low": 134.4, + "close": 134.99, + "volume": 26515100 + }, + { + "date": "2024-09-17", + "open": 136.44, + "high": 138.29, + "low": 135.44, + "close": 137.46, + "volume": 21305151 + }, + { + "date": "2024-09-18", + "open": 136.14, + "high": 137.11, + "low": 132.92, + "close": 134.17, + "volume": 34234417 + }, + { + "date": "2024-09-19", + "open": 132.33, + "high": 132.57, + "low": 130.64, + "close": 131.12, + "volume": 31105943 + }, + { + "date": "2024-09-20", + "open": 132.78, + "high": 133.87, + "low": 130.04, + "close": 131.1, + "volume": 30303814 + }, + { + "date": "2024-09-23", + "open": 132.95, + "high": 134.64, + "low": 131.76, + "close": 134.11, + "volume": 30133341 + }, + { + "date": "2024-09-24", + "open": 132.91, + "high": 133.14, + "low": 131.47, + "close": 131.57, + "volume": 34349363 + }, + { + "date": "2024-09-25", + "open": 130.61, + "high": 131.16, + "low": 130.34, + "close": 130.48, + "volume": 19155772 + }, + { + "date": "2024-09-26", + "open": 132.21, + "high": 133.65, + "low": 129.15, + "close": 130.6, + "volume": 30895866 + }, + { + "date": "2024-09-27", + "open": 128.96, + "high": 129.98, + "low": 127.64, + "close": 129.49, + "volume": 18776052 + }, + { + "date": "2024-09-30", + "open": 127.69, + "high": 128.0, + "low": 127.05, + "close": 127.19, + "volume": 29103808 + }, + { + "date": "2024-10-01", + "open": 126.57, + "high": 129.71, + "low": 126.03, + "close": 128.32, + "volume": 28980142 + }, + { + "date": "2024-10-02", + "open": 130.07, + "high": 132.02, + "low": 129.51, + "close": 131.88, + "volume": 27641199 + }, + { + "date": "2024-10-03", + "open": 131.63, + "high": 134.0, + "low": 130.48, + "close": 132.64, + "volume": 32079114 + }, + { + "date": "2024-10-04", + "open": 131.17, + "high": 131.27, + "low": 129.23, + "close": 130.66, + "volume": 30712620 + }, + { + "date": "2024-10-07", + "open": 132.49, + "high": 133.04, + "low": 132.15, + "close": 132.89, + "volume": 20238644 + }, + { + "date": "2024-10-08", + "open": 132.49, + "high": 132.95, + "low": 130.17, + "close": 130.79, + "volume": 32171498 + }, + { + "date": "2024-10-09", + "open": 129.22, + "high": 130.32, + "low": 128.28, + "close": 129.43, + "volume": 15898294 + }, + { + "date": "2024-10-10", + "open": 127.68, + "high": 129.98, + "low": 126.58, + "close": 129.56, + "volume": 19550544 + }, + { + "date": "2024-10-11", + "open": 131.29, + "high": 132.09, + "low": 130.14, + "close": 132.08, + "volume": 26428099 + }, + { + "date": "2024-10-14", + "open": 131.51, + "high": 132.85, + "low": 131.08, + "close": 131.15, + "volume": 34213903 + }, + { + "date": "2024-10-15", + "open": 132.0, + "high": 132.87, + "low": 129.91, + "close": 130.39, + "volume": 30702138 + }, + { + "date": "2024-10-16", + "open": 130.0, + "high": 130.54, + "low": 128.85, + "close": 130.16, + "volume": 32559064 + }, + { + "date": "2024-10-17", + "open": 132.0, + "high": 132.13, + "low": 129.23, + "close": 130.03, + "volume": 31203347 + }, + { + "date": "2024-10-18", + "open": 131.01, + "high": 131.41, + "low": 130.62, + "close": 131.21, + "volume": 22481402 + }, + { + "date": "2024-10-21", + "open": 129.46, + "high": 130.69, + "low": 127.1, + "close": 128.22, + "volume": 29324309 + }, + { + "date": "2024-10-22", + "open": 127.02, + "high": 127.79, + "low": 125.67, + "close": 127.53, + "volume": 16812712 + }, + { + "date": "2024-10-23", + "open": 127.28, + "high": 128.61, + "low": 124.86, + "close": 125.56, + "volume": 34819235 + }, + { + "date": "2024-10-24", + "open": 125.65, + "high": 126.87, + "low": 125.08, + "close": 125.21, + "volume": 19219721 + }, + { + "date": "2024-10-25", + "open": 124.14, + "high": 124.89, + "low": 122.51, + "close": 123.02, + "volume": 19110801 + }, + { + "date": "2024-10-28", + "open": 121.34, + "high": 124.77, + "low": 120.15, + "close": 123.31, + "volume": 15839672 + }, + { + "date": "2024-10-29", + "open": 123.22, + "high": 125.14, + "low": 122.85, + "close": 124.96, + "volume": 16661740 + }, + { + "date": "2024-10-30", + "open": 126.81, + "high": 127.53, + "low": 126.29, + "close": 127.06, + "volume": 25666222 + }, + { + "date": "2024-10-31", + "open": 125.72, + "high": 126.55, + "low": 124.46, + "close": 125.43, + "volume": 18798381 + }, + { + "date": "2024-11-01", + "open": 124.96, + "high": 126.09, + "low": 123.14, + "close": 123.22, + "volume": 27325862 + }, + { + "date": "2024-11-04", + "open": 123.09, + "high": 124.27, + "low": 121.85, + "close": 122.57, + "volume": 20260264 + }, + { + "date": "2024-11-05", + "open": 124.39, + "high": 124.87, + "low": 123.4, + "close": 124.03, + "volume": 22875328 + }, + { + "date": "2024-11-06", + "open": 122.5, + "high": 123.97, + "low": 121.78, + "close": 121.82, + "volume": 21024422 + }, + { + "date": "2024-11-07", + "open": 122.17, + "high": 123.51, + "low": 121.02, + "close": 122.76, + "volume": 30914942 + }, + { + "date": "2024-11-08", + "open": 123.24, + "high": 124.41, + "low": 121.99, + "close": 123.67, + "volume": 16433080 + }, + { + "date": "2024-11-11", + "open": 125.63, + "high": 125.96, + "low": 123.51, + "close": 124.38, + "volume": 24848264 + }, + { + "date": "2024-11-12", + "open": 125.07, + "high": 125.1, + "low": 123.33, + "close": 123.87, + "volume": 21430428 + }, + { + "date": "2024-11-13", + "open": 124.17, + "high": 126.79, + "low": 122.85, + "close": 125.93, + "volume": 28435747 + }, + { + "date": "2024-11-14", + "open": 126.25, + "high": 126.57, + "low": 125.71, + "close": 126.47, + "volume": 27477476 + }, + { + "date": "2024-11-15", + "open": 126.07, + "high": 127.46, + "low": 125.97, + "close": 127.02, + "volume": 27868832 + }, + { + "date": "2024-11-18", + "open": 128.12, + "high": 128.17, + "low": 126.71, + "close": 127.09, + "volume": 31143198 + }, + { + "date": "2024-11-19", + "open": 125.91, + "high": 126.05, + "low": 123.34, + "close": 124.28, + "volume": 31226660 + }, + { + "date": "2024-11-20", + "open": 124.96, + "high": 126.33, + "low": 123.32, + "close": 124.44, + "volume": 30722838 + }, + { + "date": "2024-11-21", + "open": 124.02, + "high": 126.31, + "low": 123.51, + "close": 125.56, + "volume": 33490495 + }, + { + "date": "2024-11-22", + "open": 125.83, + "high": 127.07, + "low": 123.64, + "close": 125.03, + "volume": 16158385 + }, + { + "date": "2024-11-25", + "open": 125.75, + "high": 126.3, + "low": 124.4, + "close": 126.02, + "volume": 21994792 + }, + { + "date": "2024-11-26", + "open": 126.31, + "high": 127.46, + "low": 125.88, + "close": 126.49, + "volume": 26482684 + }, + { + "date": "2024-11-27", + "open": 125.06, + "high": 126.42, + "low": 123.43, + "close": 124.18, + "volume": 24555794 + }, + { + "date": "2024-11-28", + "open": 125.52, + "high": 125.74, + "low": 124.3, + "close": 124.89, + "volume": 27312658 + }, + { + "date": "2024-11-29", + "open": 123.83, + "high": 125.61, + "low": 122.58, + "close": 124.67, + "volume": 22902138 + }, + { + "date": "2024-12-02", + "open": 124.72, + "high": 126.31, + "low": 124.55, + "close": 124.99, + "volume": 15373263 + }, + { + "date": "2024-12-03", + "open": 125.71, + "high": 125.98, + "low": 124.64, + "close": 125.66, + "volume": 23915293 + }, + { + "date": "2024-12-04", + "open": 125.22, + "high": 125.74, + "low": 122.63, + "close": 123.42, + "volume": 18333714 + }, + { + "date": "2024-12-05", + "open": 123.71, + "high": 124.6, + "low": 123.58, + "close": 124.27, + "volume": 33604827 + }, + { + "date": "2024-12-06", + "open": 122.57, + "high": 123.69, + "low": 120.67, + "close": 121.77, + "volume": 30695264 + }, + { + "date": "2024-12-09", + "open": 122.31, + "high": 123.6, + "low": 120.81, + "close": 122.04, + "volume": 31939910 + }, + { + "date": "2024-12-10", + "open": 122.95, + "high": 124.32, + "low": 122.7, + "close": 123.63, + "volume": 23256643 + }, + { + "date": "2024-12-11", + "open": 122.75, + "high": 124.29, + "low": 122.31, + "close": 123.48, + "volume": 32533280 + }, + { + "date": "2024-12-12", + "open": 121.98, + "high": 123.26, + "low": 121.39, + "close": 122.77, + "volume": 18394506 + }, + { + "date": "2024-12-13", + "open": 121.45, + "high": 121.89, + "low": 118.53, + "close": 119.52, + "volume": 33419620 + }, + { + "date": "2024-12-16", + "open": 117.72, + "high": 118.72, + "low": 117.5, + "close": 118.19, + "volume": 25110812 + }, + { + "date": "2024-12-17", + "open": 116.51, + "high": 117.86, + "low": 115.45, + "close": 117.25, + "volume": 30124815 + }, + { + "date": "2024-12-18", + "open": 119.0, + "high": 119.58, + "low": 118.28, + "close": 119.33, + "volume": 20620680 + }, + { + "date": "2024-12-19", + "open": 117.99, + "high": 119.01, + "low": 115.48, + "close": 116.01, + "volume": 16988674 + }, + { + "date": "2024-12-20", + "open": 117.52, + "high": 120.61, + "low": 116.97, + "close": 119.21, + "volume": 34735302 + }, + { + "date": "2024-12-23", + "open": 117.22, + "high": 119.03, + "low": 116.42, + "close": 118.29, + "volume": 24797175 + }, + { + "date": "2024-12-24", + "open": 117.32, + "high": 118.19, + "low": 116.63, + "close": 117.71, + "volume": 18514639 + }, + { + "date": "2024-12-25", + "open": 116.69, + "high": 118.35, + "low": 115.45, + "close": 117.01, + "volume": 33423232 + }, + { + "date": "2024-12-26", + "open": 117.47, + "high": 118.26, + "low": 115.86, + "close": 116.88, + "volume": 15578643 + }, + { + "date": "2024-12-27", + "open": 118.43, + "high": 119.55, + "low": 118.03, + "close": 118.6, + "volume": 24026144 + }, + { + "date": "2024-12-30", + "open": 120.56, + "high": 120.79, + "low": 119.94, + "close": 120.43, + "volume": 25248054 + }, + { + "date": "2024-12-31", + "open": 118.9, + "high": 119.77, + "low": 117.47, + "close": 119.24, + "volume": 21552040 + }, + { + "date": "2025-01-01", + "open": 117.83, + "high": 119.25, + "low": 116.28, + "close": 117.2, + "volume": 25540411 + }, + { + "date": "2025-01-02", + "open": 118.54, + "high": 119.92, + "low": 116.55, + "close": 117.85, + "volume": 22357156 + }, + { + "date": "2025-01-03", + "open": 117.05, + "high": 117.08, + "low": 115.06, + "close": 115.3, + "volume": 24344019 + }, + { + "date": "2025-01-06", + "open": 115.6, + "high": 117.13, + "low": 114.91, + "close": 115.81, + "volume": 27198651 + }, + { + "date": "2025-01-07", + "open": 117.38, + "high": 118.66, + "low": 116.31, + "close": 118.47, + "volume": 29987976 + }, + { + "date": "2025-01-08", + "open": 117.57, + "high": 119.77, + "low": 117.4, + "close": 118.79, + "volume": 16296644 + }, + { + "date": "2025-01-09", + "open": 117.79, + "high": 120.05, + "low": 117.47, + "close": 119.48, + "volume": 26732931 + }, + { + "date": "2025-01-10", + "open": 119.9, + "high": 121.38, + "low": 118.2, + "close": 118.4, + "volume": 17515705 + }, + { + "date": "2025-01-13", + "open": 118.78, + "high": 119.28, + "low": 116.24, + "close": 117.17, + "volume": 32705979 + }, + { + "date": "2025-01-14", + "open": 118.99, + "high": 119.92, + "low": 117.79, + "close": 117.84, + "volume": 31338194 + }, + { + "date": "2025-01-15", + "open": 119.28, + "high": 120.83, + "low": 118.16, + "close": 120.19, + "volume": 18295452 + }, + { + "date": "2025-01-16", + "open": 121.19, + "high": 122.69, + "low": 120.15, + "close": 120.31, + "volume": 27969858 + }, + { + "date": "2025-01-17", + "open": 118.65, + "high": 121.0, + "low": 117.61, + "close": 120.53, + "volume": 24063647 + }, + { + "date": "2025-01-20", + "open": 119.83, + "high": 121.39, + "low": 118.88, + "close": 121.1, + "volume": 16540061 + }, + { + "date": "2025-01-21", + "open": 121.25, + "high": 122.18, + "low": 120.6, + "close": 120.91, + "volume": 32147496 + }, + { + "date": "2025-01-22", + "open": 119.58, + "high": 120.32, + "low": 118.95, + "close": 119.21, + "volume": 28053255 + }, + { + "date": "2025-01-23", + "open": 118.71, + "high": 119.74, + "low": 118.63, + "close": 119.56, + "volume": 21001764 + }, + { + "date": "2025-01-24", + "open": 118.3, + "high": 119.27, + "low": 116.35, + "close": 117.23, + "volume": 15914851 + }, + { + "date": "2025-01-27", + "open": 118.49, + "high": 120.21, + "low": 117.15, + "close": 119.07, + "volume": 21419389 + }, + { + "date": "2025-01-28", + "open": 120.55, + "high": 122.16, + "low": 119.25, + "close": 121.31, + "volume": 25124665 + }, + { + "date": "2025-01-29", + "open": 120.51, + "high": 120.99, + "low": 119.19, + "close": 119.23, + "volume": 17414723 + }, + { + "date": "2025-01-30", + "open": 118.6, + "high": 120.26, + "low": 118.17, + "close": 120.06, + "volume": 19711866 + }, + { + "date": "2025-01-31", + "open": 121.97, + "high": 123.33, + "low": 119.79, + "close": 120.64, + "volume": 18757027 + }, + { + "date": "2025-02-03", + "open": 122.27, + "high": 125.04, + "low": 121.53, + "close": 124.0, + "volume": 31642702 + }, + { + "date": "2025-02-04", + "open": 122.5, + "high": 123.89, + "low": 121.72, + "close": 123.85, + "volume": 33864097 + }, + { + "date": "2025-02-05", + "open": 124.34, + "high": 125.77, + "low": 123.52, + "close": 124.79, + "volume": 25819707 + }, + { + "date": "2025-02-06", + "open": 123.37, + "high": 125.77, + "low": 122.65, + "close": 124.75, + "volume": 28098738 + }, + { + "date": "2025-02-07", + "open": 123.02, + "high": 123.97, + "low": 121.35, + "close": 122.45, + "volume": 29040373 + }, + { + "date": "2025-02-10", + "open": 123.19, + "high": 124.29, + "low": 121.74, + "close": 123.75, + "volume": 34942081 + }, + { + "date": "2025-02-11", + "open": 123.74, + "high": 126.51, + "low": 122.45, + "close": 125.62, + "volume": 33081888 + }, + { + "date": "2025-02-12", + "open": 124.17, + "high": 125.4, + "low": 123.29, + "close": 123.57, + "volume": 25853072 + }, + { + "date": "2025-02-13", + "open": 123.65, + "high": 125.35, + "low": 122.28, + "close": 124.28, + "volume": 23729724 + }, + { + "date": "2025-02-14", + "open": 125.34, + "high": 127.42, + "low": 124.64, + "close": 126.5, + "volume": 30837487 + }, + { + "date": "2025-02-17", + "open": 125.36, + "high": 127.28, + "low": 124.44, + "close": 126.5, + "volume": 26351503 + }, + { + "date": "2025-02-18", + "open": 126.49, + "high": 127.22, + "low": 125.02, + "close": 126.53, + "volume": 17992270 + }, + { + "date": "2025-02-19", + "open": 126.09, + "high": 129.13, + "low": 126.06, + "close": 127.74, + "volume": 21889982 + }, + { + "date": "2025-02-20", + "open": 127.52, + "high": 129.59, + "low": 126.63, + "close": 128.3, + "volume": 24890884 + }, + { + "date": "2025-02-21", + "open": 128.01, + "high": 130.58, + "low": 127.88, + "close": 129.81, + "volume": 34498420 + }, + { + "date": "2025-02-24", + "open": 130.15, + "high": 132.39, + "low": 129.88, + "close": 131.42, + "volume": 34777473 + }, + { + "date": "2025-02-25", + "open": 130.44, + "high": 131.62, + "low": 129.83, + "close": 129.99, + "volume": 15850199 + }, + { + "date": "2025-02-26", + "open": 131.73, + "high": 134.16, + "low": 130.29, + "close": 133.73, + "volume": 18135695 + }, + { + "date": "2025-02-27", + "open": 135.6, + "high": 135.92, + "low": 132.34, + "close": 133.76, + "volume": 28513643 + }, + { + "date": "2025-02-28", + "open": 134.43, + "high": 134.8, + "low": 133.56, + "close": 134.68, + "volume": 25118050 + }, + { + "date": "2025-03-03", + "open": 133.2, + "high": 134.82, + "low": 132.2, + "close": 133.88, + "volume": 32773249 + }, + { + "date": "2025-03-04", + "open": 135.74, + "high": 136.29, + "low": 133.53, + "close": 134.29, + "volume": 22180371 + }, + { + "date": "2025-03-05", + "open": 134.92, + "high": 135.26, + "low": 133.05, + "close": 133.91, + "volume": 26386495 + }, + { + "date": "2025-03-06", + "open": 131.96, + "high": 134.12, + "low": 130.78, + "close": 133.28, + "volume": 32350290 + }, + { + "date": "2025-03-07", + "open": 134.05, + "high": 135.29, + "low": 133.51, + "close": 133.6, + "volume": 21341470 + }, + { + "date": "2025-03-10", + "open": 134.46, + "high": 134.7, + "low": 132.69, + "close": 133.8, + "volume": 27793008 + }, + { + "date": "2025-03-11", + "open": 131.84, + "high": 132.8, + "low": 130.9, + "close": 131.78, + "volume": 27094177 + }, + { + "date": "2025-03-12", + "open": 131.21, + "high": 132.5, + "low": 130.23, + "close": 131.39, + "volume": 30366000 + }, + { + "date": "2025-03-13", + "open": 131.87, + "high": 133.48, + "low": 131.6, + "close": 133.23, + "volume": 20062512 + }, + { + "date": "2025-03-14", + "open": 134.19, + "high": 135.96, + "low": 133.97, + "close": 135.67, + "volume": 34683657 + }, + { + "date": "2025-03-17", + "open": 135.59, + "high": 135.6, + "low": 133.04, + "close": 134.28, + "volume": 34228107 + }, + { + "date": "2025-03-18", + "open": 133.43, + "high": 134.77, + "low": 133.28, + "close": 134.09, + "volume": 24265877 + }, + { + "date": "2025-03-19", + "open": 133.14, + "high": 133.74, + "low": 130.39, + "close": 131.53, + "volume": 25200210 + }, + { + "date": "2025-03-20", + "open": 132.41, + "high": 133.22, + "low": 130.97, + "close": 131.68, + "volume": 18361166 + }, + { + "date": "2025-03-21", + "open": 130.08, + "high": 130.88, + "low": 128.94, + "close": 129.87, + "volume": 16009961 + }, + { + "date": "2025-03-24", + "open": 129.91, + "high": 130.25, + "low": 127.95, + "close": 127.99, + "volume": 19206392 + }, + { + "date": "2025-03-25", + "open": 128.58, + "high": 130.43, + "low": 127.89, + "close": 129.15, + "volume": 24449865 + }, + { + "date": "2025-03-26", + "open": 128.92, + "high": 129.39, + "low": 127.26, + "close": 128.71, + "volume": 33798767 + }, + { + "date": "2025-03-27", + "open": 128.81, + "high": 131.19, + "low": 127.7, + "close": 129.71, + "volume": 31923362 + }, + { + "date": "2025-03-28", + "open": 130.44, + "high": 131.93, + "low": 129.7, + "close": 130.06, + "volume": 34147897 + }, + { + "date": "2025-03-31", + "open": 129.84, + "high": 130.01, + "low": 128.36, + "close": 129.69, + "volume": 30723263 + }, + { + "date": "2025-04-01", + "open": 130.36, + "high": 130.57, + "low": 130.02, + "close": 130.26, + "volume": 27422992 + }, + { + "date": "2025-04-02", + "open": 128.92, + "high": 130.15, + "low": 126.0, + "close": 127.45, + "volume": 28908132 + }, + { + "date": "2025-04-03", + "open": 128.19, + "high": 130.72, + "low": 126.99, + "close": 130.16, + "volume": 19856065 + }, + { + "date": "2025-04-04", + "open": 128.22, + "high": 128.26, + "low": 127.02, + "close": 127.08, + "volume": 22714931 + }, + { + "date": "2025-04-07", + "open": 126.25, + "high": 129.46, + "low": 125.73, + "close": 128.15, + "volume": 19043909 + }, + { + "date": "2025-04-08", + "open": 129.79, + "high": 129.88, + "low": 127.36, + "close": 128.21, + "volume": 18290669 + }, + { + "date": "2025-04-09", + "open": 129.17, + "high": 131.34, + "low": 127.68, + "close": 129.9, + "volume": 21191582 + }, + { + "date": "2025-04-10", + "open": 128.5, + "high": 129.16, + "low": 126.57, + "close": 127.57, + "volume": 22916007 + }, + { + "date": "2025-04-11", + "open": 126.66, + "high": 129.95, + "low": 125.37, + "close": 128.55, + "volume": 20965788 + }, + { + "date": "2025-04-14", + "open": 128.97, + "high": 129.4, + "low": 127.46, + "close": 128.69, + "volume": 16902671 + }, + { + "date": "2025-04-15", + "open": 127.84, + "high": 129.26, + "low": 126.91, + "close": 128.55, + "volume": 24931434 + }, + { + "date": "2025-04-16", + "open": 126.59, + "high": 126.83, + "low": 124.69, + "close": 125.53, + "volume": 19214847 + }, + { + "date": "2025-04-17", + "open": 125.87, + "high": 126.46, + "low": 124.37, + "close": 124.71, + "volume": 27525252 + }, + { + "date": "2025-04-18", + "open": 123.47, + "high": 124.03, + "low": 122.99, + "close": 123.52, + "volume": 18070391 + }, + { + "date": "2025-04-21", + "open": 123.45, + "high": 125.75, + "low": 122.05, + "close": 124.54, + "volume": 24543657 + }, + { + "date": "2025-04-22", + "open": 124.06, + "high": 126.49, + "low": 123.6, + "close": 125.0, + "volume": 29288758 + }, + { + "date": "2025-04-23", + "open": 123.66, + "high": 125.8, + "low": 122.96, + "close": 125.36, + "volume": 19050845 + }, + { + "date": "2025-04-24", + "open": 127.07, + "high": 129.1, + "low": 126.83, + "close": 128.22, + "volume": 15953744 + }, + { + "date": "2025-04-25", + "open": 128.47, + "high": 129.05, + "low": 125.18, + "close": 126.54, + "volume": 22887813 + }, + { + "date": "2025-04-28", + "open": 127.62, + "high": 128.22, + "low": 125.62, + "close": 125.87, + "volume": 28251118 + }, + { + "date": "2025-04-29", + "open": 126.3, + "high": 128.96, + "low": 126.1, + "close": 127.83, + "volume": 32261419 + }, + { + "date": "2025-04-30", + "open": 127.36, + "high": 127.49, + "low": 126.93, + "close": 127.26, + "volume": 28377198 + }, + { + "date": "2025-05-01", + "open": 126.53, + "high": 127.49, + "low": 124.79, + "close": 124.91, + "volume": 20628182 + }, + { + "date": "2025-05-02", + "open": 125.96, + "high": 128.71, + "low": 124.76, + "close": 127.82, + "volume": 30787376 + }, + { + "date": "2025-05-05", + "open": 126.94, + "high": 127.66, + "low": 124.41, + "close": 125.74, + "volume": 32013880 + }, + { + "date": "2025-05-06", + "open": 124.48, + "high": 125.4, + "low": 122.86, + "close": 123.23, + "volume": 23927227 + }, + { + "date": "2025-05-07", + "open": 122.57, + "high": 124.98, + "low": 121.53, + "close": 124.23, + "volume": 28467879 + }, + { + "date": "2025-05-08", + "open": 125.03, + "high": 126.03, + "low": 123.96, + "close": 125.78, + "volume": 15388205 + }, + { + "date": "2025-05-09", + "open": 125.65, + "high": 127.27, + "low": 125.45, + "close": 126.43, + "volume": 32425175 + }, + { + "date": "2025-05-12", + "open": 126.97, + "high": 128.46, + "low": 125.85, + "close": 125.96, + "volume": 16928843 + }, + { + "date": "2025-05-13", + "open": 124.91, + "high": 126.72, + "low": 124.63, + "close": 126.51, + "volume": 15874631 + }, + { + "date": "2025-05-14", + "open": 126.26, + "high": 127.75, + "low": 125.65, + "close": 126.16, + "volume": 24607489 + }, + { + "date": "2025-05-15", + "open": 127.28, + "high": 127.44, + "low": 124.32, + "close": 125.81, + "volume": 24351526 + }, + { + "date": "2025-05-16", + "open": 126.24, + "high": 126.76, + "low": 125.0, + "close": 126.46, + "volume": 18640260 + }, + { + "date": "2025-05-19", + "open": 127.0, + "high": 127.82, + "low": 125.67, + "close": 127.18, + "volume": 26324200 + }, + { + "date": "2025-05-20", + "open": 128.42, + "high": 129.35, + "low": 127.53, + "close": 129.01, + "volume": 21845718 + }, + { + "date": "2025-05-21", + "open": 130.31, + "high": 131.56, + "low": 129.31, + "close": 131.45, + "volume": 26502001 + }, + { + "date": "2025-05-22", + "open": 132.9, + "high": 135.37, + "low": 132.48, + "close": 134.86, + "volume": 19986070 + }, + { + "date": "2025-05-23", + "open": 135.76, + "high": 136.85, + "low": 134.15, + "close": 135.61, + "volume": 25948691 + }, + { + "date": "2025-05-26", + "open": 134.19, + "high": 134.77, + "low": 132.95, + "close": 134.09, + "volume": 21914025 + }, + { + "date": "2025-05-27", + "open": 134.96, + "high": 136.43, + "low": 134.14, + "close": 135.86, + "volume": 34233432 + }, + { + "date": "2025-05-28", + "open": 137.44, + "high": 137.46, + "low": 134.11, + "close": 135.6, + "volume": 21915419 + }, + { + "date": "2025-05-29", + "open": 134.35, + "high": 135.1, + "low": 133.36, + "close": 134.4, + "volume": 20669194 + }, + { + "date": "2025-05-30", + "open": 132.62, + "high": 134.11, + "low": 131.28, + "close": 134.01, + "volume": 31117143 + }, + { + "date": "2025-06-02", + "open": 134.06, + "high": 135.37, + "low": 134.04, + "close": 134.91, + "volume": 25539340 + }, + { + "date": "2025-06-03", + "open": 136.79, + "high": 137.74, + "low": 135.18, + "close": 135.88, + "volume": 31287593 + }, + { + "date": "2025-06-04", + "open": 137.82, + "high": 139.98, + "low": 137.12, + "close": 139.7, + "volume": 26078491 + }, + { + "date": "2025-06-05", + "open": 141.08, + "high": 141.88, + "low": 140.49, + "close": 141.73, + "volume": 27840058 + }, + { + "date": "2025-06-06", + "open": 142.56, + "high": 144.41, + "low": 141.7, + "close": 144.2, + "volume": 24221004 + }, + { + "date": "2025-06-09", + "open": 143.06, + "high": 143.25, + "low": 141.59, + "close": 142.02, + "volume": 17342327 + }, + { + "date": "2025-06-10", + "open": 142.86, + "high": 145.44, + "low": 141.56, + "close": 144.81, + "volume": 34984655 + }, + { + "date": "2025-06-11", + "open": 144.3, + "high": 145.19, + "low": 143.44, + "close": 144.4, + "volume": 27617618 + }, + { + "date": "2025-06-12", + "open": 143.4, + "high": 144.74, + "low": 142.0, + "close": 144.49, + "volume": 34164315 + }, + { + "date": "2025-06-13", + "open": 143.25, + "high": 145.71, + "low": 143.2, + "close": 145.23, + "volume": 27528769 + }, + { + "date": "2025-06-16", + "open": 143.58, + "high": 145.03, + "low": 142.34, + "close": 142.97, + "volume": 34224718 + }, + { + "date": "2025-06-17", + "open": 143.9, + "high": 144.83, + "low": 143.78, + "close": 143.93, + "volume": 15350520 + }, + { + "date": "2025-06-18", + "open": 144.26, + "high": 145.8, + "low": 144.22, + "close": 145.31, + "volume": 27993603 + }, + { + "date": "2025-06-19", + "open": 144.22, + "high": 145.04, + "low": 143.67, + "close": 144.33, + "volume": 25138772 + }, + { + "date": "2025-06-20", + "open": 145.21, + "high": 145.53, + "low": 144.09, + "close": 144.84, + "volume": 23457398 + }, + { + "date": "2025-06-23", + "open": 143.01, + "high": 143.66, + "low": 142.95, + "close": 143.41, + "volume": 19753695 + }, + { + "date": "2025-06-24", + "open": 141.64, + "high": 143.19, + "low": 140.22, + "close": 142.03, + "volume": 25819750 + }, + { + "date": "2025-06-25", + "open": 141.73, + "high": 143.1, + "low": 140.34, + "close": 141.66, + "volume": 34193217 + }, + { + "date": "2025-06-26", + "open": 140.83, + "high": 140.87, + "low": 138.3, + "close": 139.6, + "volume": 18343664 + }, + { + "date": "2025-06-27", + "open": 137.89, + "high": 140.13, + "low": 136.83, + "close": 138.76, + "volume": 20323148 + }, + { + "date": "2025-06-30", + "open": 140.11, + "high": 140.57, + "low": 137.57, + "close": 138.35, + "volume": 25628026 + } +] \ No newline at end of file diff --git a/vue/src/ai-components/ai-chart/data/tsla-data.json b/vue/src/ai-components/ai-chart/data/tsla-data.json new file mode 100644 index 0000000..b0da1fc --- /dev/null +++ b/vue/src/ai-components/ai-chart/data/tsla-data.json @@ -0,0 +1,1766 @@ +[ + { + "Date": "2024-07-01", + "Open": 195.66, + "High": 195.82, + "Low": 193.84, + "Close": 193.86 + }, + { + "Date": "2024-07-02", + "Open": 193.54, + "High": 193.87, + "Low": 192.46, + "Close": 192.55 + }, + { + "Date": "2024-07-03", + "Open": 193.06, + "High": 193.17, + "Low": 192.71, + "Close": 192.81 + }, + { + "Date": "2024-07-04", + "Open": 194.47, + "High": 195.45, + "Low": 192.64, + "Close": 195.38 + }, + { + "Date": "2024-07-05", + "Open": 197.01, + "High": 197.21, + "Low": 195.16, + "Close": 195.7 + }, + { + "Date": "2024-07-08", + "Open": 194.47, + "High": 196.23, + "Low": 193.01, + "Close": 195.24 + }, + { + "Date": "2024-07-09", + "Open": 194.28, + "High": 194.8, + "Low": 192.46, + "Close": 193.87 + }, + { + "Date": "2024-07-10", + "Open": 192.4, + "High": 194.3, + "Low": 192.29, + "Close": 193.74 + }, + { + "Date": "2024-07-11", + "Open": 195.05, + "High": 196.03, + "Low": 193.28, + "Close": 193.54 + }, + { + "Date": "2024-07-12", + "Open": 192.99, + "High": 193.79, + "Low": 191.7, + "Close": 191.97 + }, + { + "Date": "2024-07-15", + "Open": 190.34, + "High": 190.51, + "Low": 188.47, + "Close": 189.21 + }, + { + "Date": "2024-07-16", + "Open": 189.93, + "High": 190.33, + "Low": 188.1, + "Close": 189.98 + }, + { + "Date": "2024-07-17", + "Open": 188.65, + "High": 188.92, + "Low": 187.77, + "Close": 188.45 + }, + { + "Date": "2024-07-18", + "Open": 188.27, + "High": 189.07, + "Low": 186.78, + "Close": 186.95 + }, + { + "Date": "2024-07-19", + "Open": 186.35, + "High": 188.13, + "Low": 184.46, + "Close": 186.47 + }, + { + "Date": "2024-07-22", + "Open": 185.91, + "High": 186.34, + "Low": 184.89, + "Close": 185.64 + }, + { + "Date": "2024-07-23", + "Open": 184.99, + "High": 185.48, + "Low": 183.15, + "Close": 184.34 + }, + { + "Date": "2024-07-24", + "Open": 183.49, + "High": 183.49, + "Low": 182.74, + "Close": 182.75 + }, + { + "Date": "2024-07-25", + "Open": 184.73, + "High": 185.05, + "Low": 183.16, + "Close": 183.41 + }, + { + "Date": "2024-07-26", + "Open": 184.89, + "High": 186.59, + "Low": 183.44, + "Close": 186.16 + }, + { + "Date": "2024-07-29", + "Open": 184.85, + "High": 186.63, + "Low": 184.52, + "Close": 185.09 + }, + { + "Date": "2024-07-30", + "Open": 183.31, + "High": 184.75, + "Low": 182.73, + "Close": 184.16 + }, + { + "Date": "2024-07-31", + "Open": 185.26, + "High": 185.75, + "Low": 184.33, + "Close": 185.42 + }, + { + "Date": "2024-08-01", + "Open": 184.56, + "High": 185.42, + "Low": 184.46, + "Close": 184.85 + }, + { + "Date": "2024-08-02", + "Open": 186.46, + "High": 188.11, + "Low": 185.82, + "Close": 187.76 + }, + { + "Date": "2024-08-05", + "Open": 188.43, + "High": 190.37, + "Low": 186.47, + "Close": 187.08 + }, + { + "Date": "2024-08-06", + "Open": 188.09, + "High": 189.71, + "Low": 186.7, + "Close": 188.21 + }, + { + "Date": "2024-08-07", + "Open": 189.42, + "High": 191.01, + "Low": 188.7, + "Close": 190.54 + }, + { + "Date": "2024-08-08", + "Open": 191.55, + "High": 191.8, + "Low": 191.17, + "Close": 191.74 + }, + { + "Date": "2024-08-09", + "Open": 191.07, + "High": 192.23, + "Low": 189.36, + "Close": 191.35 + }, + { + "Date": "2024-08-12", + "Open": 192.98, + "High": 194.2, + "Low": 191.88, + "Close": 192.1 + }, + { + "Date": "2024-08-13", + "Open": 191.4, + "High": 192.95, + "Low": 190.37, + "Close": 192.92 + }, + { + "Date": "2024-08-14", + "Open": 193.41, + "High": 194.71, + "Low": 193.24, + "Close": 194.66 + }, + { + "Date": "2024-08-15", + "Open": 192.87, + "High": 194.07, + "Low": 191.97, + "Close": 192.37 + }, + { + "Date": "2024-08-16", + "Open": 192.73, + "High": 194.0, + "Low": 191.06, + "Close": 191.11 + }, + { + "Date": "2024-08-19", + "Open": 189.48, + "High": 189.67, + "Low": 188.61, + "Close": 189.65 + }, + { + "Date": "2024-08-20", + "Open": 190.6, + "High": 191.19, + "Low": 189.29, + "Close": 190.11 + }, + { + "Date": "2024-08-21", + "Open": 191.5, + "High": 192.53, + "Low": 190.21, + "Close": 190.37 + }, + { + "Date": "2024-08-22", + "Open": 191.04, + "High": 191.5, + "Low": 189.48, + "Close": 191.33 + }, + { + "Date": "2024-08-23", + "Open": 191.47, + "High": 191.49, + "Low": 190.22, + "Close": 190.41 + }, + { + "Date": "2024-08-26", + "Open": 192.19, + "High": 193.05, + "Low": 190.63, + "Close": 191.18 + }, + { + "Date": "2024-08-27", + "Open": 189.78, + "High": 191.53, + "Low": 188.75, + "Close": 188.89 + }, + { + "Date": "2024-08-28", + "Open": 188.02, + "High": 189.69, + "Low": 186.35, + "Close": 187.56 + }, + { + "Date": "2024-08-29", + "Open": 185.82, + "High": 186.41, + "Low": 183.98, + "Close": 185.49 + }, + { + "Date": "2024-08-30", + "Open": 185.03, + "High": 185.53, + "Low": 184.58, + "Close": 185.2 + }, + { + "Date": "2024-09-02", + "Open": 184.49, + "High": 184.49, + "Low": 184.19, + "Close": 184.39 + }, + { + "Date": "2024-09-03", + "Open": 184.67, + "High": 185.21, + "Low": 184.02, + "Close": 184.21 + }, + { + "Date": "2024-09-04", + "Open": 185.63, + "High": 185.86, + "Low": 185.62, + "Close": 185.65 + }, + { + "Date": "2024-09-05", + "Open": 186.12, + "High": 187.17, + "Low": 185.38, + "Close": 186.7 + }, + { + "Date": "2024-09-06", + "Open": 187.26, + "High": 187.39, + "Low": 185.47, + "Close": 185.73 + }, + { + "Date": "2024-09-09", + "Open": 187.61, + "High": 189.53, + "Low": 186.6, + "Close": 186.97 + }, + { + "Date": "2024-09-10", + "Open": 185.28, + "High": 185.91, + "Low": 183.77, + "Close": 183.79 + }, + { + "Date": "2024-09-11", + "Open": 182.37, + "High": 182.42, + "Low": 182.05, + "Close": 182.32 + }, + { + "Date": "2024-09-12", + "Open": 182.2, + "High": 183.2, + "Low": 181.85, + "Close": 182.82 + }, + { + "Date": "2024-09-13", + "Open": 181.13, + "High": 181.47, + "Low": 180.91, + "Close": 181.38 + }, + { + "Date": "2024-09-16", + "Open": 181.95, + "High": 183.37, + "Low": 181.41, + "Close": 182.18 + }, + { + "Date": "2024-09-17", + "Open": 181.12, + "High": 182.67, + "Low": 179.76, + "Close": 180.47 + }, + { + "Date": "2024-09-18", + "Open": 179.96, + "High": 180.57, + "Low": 179.63, + "Close": 180.49 + }, + { + "Date": "2024-09-19", + "Open": 182.48, + "High": 184.27, + "Low": 181.04, + "Close": 181.67 + }, + { + "Date": "2024-09-20", + "Open": 183.14, + "High": 184.14, + "Low": 183.06, + "Close": 184.1 + }, + { + "Date": "2024-09-23", + "Open": 185.02, + "High": 185.51, + "Low": 183.19, + "Close": 185.18 + }, + { + "Date": "2024-09-24", + "Open": 184.77, + "High": 185.25, + "Low": 183.16, + "Close": 184.64 + }, + { + "Date": "2024-09-25", + "Open": 184.45, + "High": 185.46, + "Low": 184.29, + "Close": 184.47 + }, + { + "Date": "2024-09-26", + "Open": 183.99, + "High": 185.17, + "Low": 182.9, + "Close": 183.26 + }, + { + "Date": "2024-09-27", + "Open": 182.65, + "High": 183.76, + "Low": 180.99, + "Close": 183.32 + }, + { + "Date": "2024-09-30", + "Open": 182.52, + "High": 184.48, + "Low": 182.48, + "Close": 183.74 + }, + { + "Date": "2024-10-01", + "Open": 183.67, + "High": 185.11, + "Low": 182.29, + "Close": 183.1 + }, + { + "Date": "2024-10-02", + "Open": 181.28, + "High": 181.81, + "Low": 180.99, + "Close": 181.72 + }, + { + "Date": "2024-10-03", + "Open": 183.16, + "High": 183.46, + "Low": 181.86, + "Close": 182.58 + }, + { + "Date": "2024-10-04", + "Open": 183.46, + "High": 184.67, + "Low": 182.35, + "Close": 183.94 + }, + { + "Date": "2024-10-07", + "Open": 183.82, + "High": 185.45, + "Low": 181.87, + "Close": 184.19 + }, + { + "Date": "2024-10-08", + "Open": 185.96, + "High": 187.79, + "Low": 185.22, + "Close": 185.49 + }, + { + "Date": "2024-10-09", + "Open": 184.88, + "High": 184.95, + "Low": 183.85, + "Close": 184.06 + }, + { + "Date": "2024-10-10", + "Open": 182.43, + "High": 183.61, + "Low": 182.33, + "Close": 182.83 + }, + { + "Date": "2024-10-11", + "Open": 183.67, + "High": 184.3, + "Low": 183.36, + "Close": 183.72 + }, + { + "Date": "2024-10-14", + "Open": 185.63, + "High": 187.5, + "Low": 185.03, + "Close": 186.45 + }, + { + "Date": "2024-10-15", + "Open": 184.73, + "High": 185.32, + "Low": 184.25, + "Close": 184.94 + }, + { + "Date": "2024-10-16", + "Open": 186.52, + "High": 187.92, + "Low": 186.34, + "Close": 186.97 + }, + { + "Date": "2024-10-17", + "Open": 188.82, + "High": 189.36, + "Low": 188.3, + "Close": 189.28 + }, + { + "Date": "2024-10-18", + "Open": 187.6, + "High": 188.86, + "Low": 187.24, + "Close": 187.35 + }, + { + "Date": "2024-10-21", + "Open": 188.62, + "High": 188.97, + "Low": 186.73, + "Close": 186.99 + }, + { + "Date": "2024-10-22", + "Open": 186.85, + "High": 187.14, + "Low": 185.83, + "Close": 186.51 + }, + { + "Date": "2024-10-23", + "Open": 187.86, + "High": 188.1, + "Low": 186.43, + "Close": 187.71 + }, + { + "Date": "2024-10-24", + "Open": 186.19, + "High": 186.44, + "Low": 185.14, + "Close": 185.59 + }, + { + "Date": "2024-10-25", + "Open": 184.74, + "High": 185.53, + "Low": 183.75, + "Close": 185.34 + }, + { + "Date": "2024-10-28", + "Open": 186.81, + "High": 188.37, + "Low": 186.63, + "Close": 186.79 + }, + { + "Date": "2024-10-29", + "Open": 186.02, + "High": 187.27, + "Low": 185.59, + "Close": 185.8 + }, + { + "Date": "2024-10-30", + "Open": 183.85, + "High": 185.2, + "Low": 182.76, + "Close": 184.74 + }, + { + "Date": "2024-10-31", + "Open": 185.51, + "High": 186.83, + "Low": 184.31, + "Close": 186.29 + }, + { + "Date": "2024-11-01", + "Open": 186.1, + "High": 188.02, + "Low": 184.11, + "Close": 186.12 + }, + { + "Date": "2024-11-04", + "Open": 187.28, + "High": 187.73, + "Low": 186.07, + "Close": 186.7 + }, + { + "Date": "2024-11-05", + "Open": 185.94, + "High": 186.09, + "Low": 185.87, + "Close": 186.06 + }, + { + "Date": "2024-11-06", + "Open": 187.97, + "High": 189.29, + "Low": 187.41, + "Close": 188.76 + }, + { + "Date": "2024-11-07", + "Open": 187.22, + "High": 188.11, + "Low": 186.53, + "Close": 187.99 + }, + { + "Date": "2024-11-08", + "Open": 186.19, + "High": 187.91, + "Low": 185.03, + "Close": 186.65 + }, + { + "Date": "2024-11-11", + "Open": 185.91, + "High": 187.61, + "Low": 185.85, + "Close": 187.25 + }, + { + "Date": "2024-11-12", + "Open": 187.22, + "High": 187.45, + "Low": 187.02, + "Close": 187.19 + }, + { + "Date": "2024-11-13", + "Open": 189.12, + "High": 189.37, + "Low": 188.37, + "Close": 188.77 + }, + { + "Date": "2024-11-14", + "Open": 188.14, + "High": 188.84, + "Low": 187.98, + "Close": 188.0 + }, + { + "Date": "2024-11-15", + "Open": 186.66, + "High": 188.54, + "Low": 185.12, + "Close": 187.31 + }, + { + "Date": "2024-11-18", + "Open": 186.52, + "High": 188.11, + "Low": 185.21, + "Close": 186.46 + }, + { + "Date": "2024-11-19", + "Open": 187.18, + "High": 188.3, + "Low": 186.35, + "Close": 187.41 + }, + { + "Date": "2024-11-20", + "Open": 186.14, + "High": 186.53, + "Low": 185.59, + "Close": 186.44 + }, + { + "Date": "2024-11-21", + "Open": 186.36, + "High": 187.64, + "Low": 185.42, + "Close": 187.19 + }, + { + "Date": "2024-11-22", + "Open": 185.85, + "High": 186.91, + "Low": 185.04, + "Close": 186.76 + }, + { + "Date": "2024-11-25", + "Open": 187.81, + "High": 188.54, + "Low": 187.66, + "Close": 187.91 + }, + { + "Date": "2024-11-26", + "Open": 187.42, + "High": 188.86, + "Low": 186.32, + "Close": 186.84 + }, + { + "Date": "2024-11-27", + "Open": 185.81, + "High": 186.6, + "Low": 184.96, + "Close": 184.97 + }, + { + "Date": "2024-11-28", + "Open": 183.02, + "High": 183.53, + "Low": 181.04, + "Close": 183.19 + }, + { + "Date": "2024-11-29", + "Open": 182.96, + "High": 184.58, + "Low": 181.53, + "Close": 183.92 + }, + { + "Date": "2024-12-02", + "Open": 185.24, + "High": 186.47, + "Low": 183.93, + "Close": 185.47 + }, + { + "Date": "2024-12-03", + "Open": 186.99, + "High": 187.19, + "Low": 186.48, + "Close": 187.08 + }, + { + "Date": "2024-12-04", + "Open": 187.2, + "High": 188.46, + "Low": 186.92, + "Close": 187.09 + }, + { + "Date": "2024-12-05", + "Open": 187.91, + "High": 187.96, + "Low": 186.32, + "Close": 187.84 + }, + { + "Date": "2024-12-06", + "Open": 188.22, + "High": 189.15, + "Low": 188.18, + "Close": 189.07 + }, + { + "Date": "2024-12-09", + "Open": 189.84, + "High": 190.87, + "Low": 189.34, + "Close": 189.68 + }, + { + "Date": "2024-12-10", + "Open": 188.63, + "High": 188.97, + "Low": 188.13, + "Close": 188.71 + }, + { + "Date": "2024-12-11", + "Open": 190.52, + "High": 192.05, + "Low": 190.5, + "Close": 191.41 + }, + { + "Date": "2024-12-12", + "Open": 193.23, + "High": 193.26, + "Low": 191.72, + "Close": 191.97 + }, + { + "Date": "2024-12-13", + "Open": 193.65, + "High": 194.62, + "Low": 193.13, + "Close": 193.25 + }, + { + "Date": "2024-12-16", + "Open": 194.02, + "High": 194.96, + "Low": 192.67, + "Close": 194.53 + }, + { + "Date": "2024-12-17", + "Open": 195.17, + "High": 196.46, + "Low": 193.96, + "Close": 194.86 + }, + { + "Date": "2024-12-18", + "Open": 195.74, + "High": 197.71, + "Low": 194.45, + "Close": 195.52 + }, + { + "Date": "2024-12-19", + "Open": 197.34, + "High": 198.14, + "Low": 195.82, + "Close": 197.66 + }, + { + "Date": "2024-12-20", + "Open": 195.84, + "High": 196.87, + "Low": 195.17, + "Close": 196.66 + }, + { + "Date": "2024-12-23", + "Open": 195.6, + "High": 197.45, + "Low": 194.58, + "Close": 196.73 + }, + { + "Date": "2024-12-24", + "Open": 195.22, + "High": 195.45, + "Low": 194.98, + "Close": 195.33 + }, + { + "Date": "2024-12-25", + "Open": 197.24, + "High": 198.3, + "Low": 196.44, + "Close": 196.72 + }, + { + "Date": "2024-12-26", + "Open": 197.82, + "High": 197.94, + "Low": 196.01, + "Close": 197.9 + }, + { + "Date": "2024-12-27", + "Open": 197.57, + "High": 198.09, + "Low": 195.95, + "Close": 196.75 + }, + { + "Date": "2024-12-30", + "Open": 195.06, + "High": 196.38, + "Low": 193.09, + "Close": 193.41 + }, + { + "Date": "2024-12-31", + "Open": 193.53, + "High": 194.26, + "Low": 192.13, + "Close": 192.3 + }, + { + "Date": "2025-01-01", + "Open": 190.38, + "High": 191.1, + "Low": 189.02, + "Close": 189.31 + }, + { + "Date": "2025-01-02", + "Open": 188.98, + "High": 189.05, + "Low": 187.3, + "Close": 188.03 + }, + { + "Date": "2025-01-03", + "Open": 187.74, + "High": 187.81, + "Low": 187.22, + "Close": 187.55 + }, + { + "Date": "2025-01-06", + "Open": 186.09, + "High": 187.14, + "Low": 185.52, + "Close": 186.66 + }, + { + "Date": "2025-01-07", + "Open": 186.16, + "High": 188.01, + "Low": 185.81, + "Close": 187.76 + }, + { + "Date": "2025-01-08", + "Open": 188.28, + "High": 188.85, + "Low": 187.06, + "Close": 187.32 + }, + { + "Date": "2025-01-09", + "Open": 187.65, + "High": 189.42, + "Low": 187.23, + "Close": 188.99 + }, + { + "Date": "2025-01-10", + "Open": 188.68, + "High": 190.2, + "Low": 186.71, + "Close": 189.95 + }, + { + "Date": "2025-01-13", + "Open": 189.19, + "High": 189.35, + "Low": 188.07, + "Close": 189.22 + }, + { + "Date": "2025-01-14", + "Open": 188.09, + "High": 189.68, + "Low": 187.77, + "Close": 188.92 + }, + { + "Date": "2025-01-15", + "Open": 188.84, + "High": 190.76, + "Low": 187.79, + "Close": 189.05 + }, + { + "Date": "2025-01-16", + "Open": 190.87, + "High": 191.81, + "Low": 190.07, + "Close": 191.13 + }, + { + "Date": "2025-01-17", + "Open": 191.0, + "High": 192.4, + "Low": 189.38, + "Close": 191.28 + }, + { + "Date": "2025-01-20", + "Open": 189.67, + "High": 190.07, + "Low": 189.32, + "Close": 189.81 + }, + { + "Date": "2025-01-21", + "Open": 189.37, + "High": 190.71, + "Low": 188.05, + "Close": 188.89 + }, + { + "Date": "2025-01-22", + "Open": 188.01, + "High": 189.31, + "Low": 186.59, + "Close": 187.2 + }, + { + "Date": "2025-01-23", + "Open": 187.45, + "High": 188.25, + "Low": 186.99, + "Close": 187.91 + }, + { + "Date": "2025-01-24", + "Open": 187.36, + "High": 187.55, + "Low": 186.89, + "Close": 187.43 + }, + { + "Date": "2025-01-27", + "Open": 187.43, + "High": 187.56, + "Low": 186.49, + "Close": 186.5 + }, + { + "Date": "2025-01-28", + "Open": 188.4, + "High": 189.15, + "Low": 187.29, + "Close": 188.28 + }, + { + "Date": "2025-01-29", + "Open": 189.36, + "High": 189.64, + "Low": 189.25, + "Close": 189.6 + }, + { + "Date": "2025-01-30", + "Open": 190.83, + "High": 192.32, + "Low": 189.02, + "Close": 189.09 + }, + { + "Date": "2025-01-31", + "Open": 190.72, + "High": 191.82, + "Low": 190.59, + "Close": 191.13 + }, + { + "Date": "2025-02-03", + "Open": 193.03, + "High": 194.31, + "Low": 191.75, + "Close": 193.04 + }, + { + "Date": "2025-02-04", + "Open": 194.85, + "High": 194.97, + "Low": 194.33, + "Close": 194.61 + }, + { + "Date": "2025-02-05", + "Open": 194.15, + "High": 194.31, + "Low": 193.1, + "Close": 193.53 + }, + { + "Date": "2025-02-06", + "Open": 192.71, + "High": 193.71, + "Low": 192.3, + "Close": 192.42 + }, + { + "Date": "2025-02-07", + "Open": 193.56, + "High": 195.06, + "Low": 192.39, + "Close": 194.3 + }, + { + "Date": "2025-02-10", + "Open": 194.13, + "High": 195.49, + "Low": 193.23, + "Close": 194.15 + }, + { + "Date": "2025-02-11", + "Open": 193.87, + "High": 194.28, + "Low": 191.88, + "Close": 193.85 + }, + { + "Date": "2025-02-12", + "Open": 194.08, + "High": 194.92, + "Low": 193.29, + "Close": 194.37 + }, + { + "Date": "2025-02-13", + "Open": 195.95, + "High": 196.12, + "Low": 194.59, + "Close": 194.76 + }, + { + "Date": "2025-02-14", + "Open": 196.67, + "High": 197.2, + "Low": 195.87, + "Close": 197.07 + }, + { + "Date": "2025-02-17", + "Open": 197.8, + "High": 198.45, + "Low": 197.39, + "Close": 198.1 + }, + { + "Date": "2025-02-18", + "Open": 196.5, + "High": 196.53, + "Low": 196.42, + "Close": 196.49 + }, + { + "Date": "2025-02-19", + "Open": 198.21, + "High": 199.98, + "Low": 196.75, + "Close": 199.62 + }, + { + "Date": "2025-02-20", + "Open": 199.75, + "High": 200.36, + "Low": 198.57, + "Close": 199.63 + }, + { + "Date": "2025-02-21", + "Open": 197.92, + "High": 199.83, + "Low": 195.96, + "Close": 196.73 + }, + { + "Date": "2025-02-24", + "Open": 197.58, + "High": 198.27, + "Low": 196.56, + "Close": 197.9 + }, + { + "Date": "2025-02-25", + "Open": 199.68, + "High": 199.99, + "Low": 199.67, + "Close": 199.96 + }, + { + "Date": "2025-02-26", + "Open": 200.89, + "High": 202.56, + "Low": 200.44, + "Close": 201.75 + }, + { + "Date": "2025-02-27", + "Open": 203.12, + "High": 204.07, + "Low": 202.32, + "Close": 203.07 + }, + { + "Date": "2025-02-28", + "Open": 203.29, + "High": 204.58, + "Low": 201.8, + "Close": 203.09 + }, + { + "Date": "2025-03-03", + "Open": 204.76, + "High": 205.95, + "Low": 204.23, + "Close": 205.26 + }, + { + "Date": "2025-03-04", + "Open": 205.83, + "High": 206.98, + "Low": 205.09, + "Close": 205.66 + }, + { + "Date": "2025-03-05", + "Open": 206.2, + "High": 207.54, + "Low": 204.63, + "Close": 206.57 + }, + { + "Date": "2025-03-06", + "Open": 204.69, + "High": 205.3, + "Low": 204.17, + "Close": 205.09 + }, + { + "Date": "2025-03-07", + "Open": 203.85, + "High": 204.63, + "Low": 202.53, + "Close": 204.25 + }, + { + "Date": "2025-03-10", + "Open": 206.23, + "High": 207.04, + "Low": 204.61, + "Close": 206.76 + }, + { + "Date": "2025-03-11", + "Open": 205.49, + "High": 205.94, + "Low": 203.95, + "Close": 205.46 + }, + { + "Date": "2025-03-12", + "Open": 203.83, + "High": 204.1, + "Low": 203.11, + "Close": 204.04 + }, + { + "Date": "2025-03-13", + "Open": 203.66, + "High": 205.08, + "Low": 203.03, + "Close": 203.39 + }, + { + "Date": "2025-03-14", + "Open": 203.25, + "High": 203.33, + "Low": 202.56, + "Close": 202.58 + }, + { + "Date": "2025-03-17", + "Open": 203.82, + "High": 205.4, + "Low": 203.6, + "Close": 204.42 + }, + { + "Date": "2025-03-18", + "Open": 204.05, + "High": 204.1, + "Low": 203.78, + "Close": 203.93 + }, + { + "Date": "2025-03-19", + "Open": 204.4, + "High": 205.85, + "Low": 203.03, + "Close": 203.06 + }, + { + "Date": "2025-03-20", + "Open": 203.74, + "High": 203.82, + "Low": 203.11, + "Close": 203.66 + }, + { + "Date": "2025-03-21", + "Open": 205.41, + "High": 206.08, + "Low": 203.65, + "Close": 205.55 + }, + { + "Date": "2025-03-24", + "Open": 204.87, + "High": 206.03, + "Low": 204.11, + "Close": 205.9 + }, + { + "Date": "2025-03-25", + "Open": 206.51, + "High": 208.2, + "Low": 205.47, + "Close": 205.93 + }, + { + "Date": "2025-03-26", + "Open": 207.88, + "High": 209.87, + "Low": 206.21, + "Close": 208.94 + }, + { + "Date": "2025-03-27", + "Open": 208.24, + "High": 208.93, + "Low": 206.62, + "Close": 207.73 + }, + { + "Date": "2025-03-28", + "Open": 205.85, + "High": 206.28, + "Low": 205.57, + "Close": 205.58 + }, + { + "Date": "2025-03-31", + "Open": 206.61, + "High": 206.68, + "Low": 205.31, + "Close": 205.47 + }, + { + "Date": "2025-04-01", + "Open": 206.32, + "High": 207.32, + "Low": 205.77, + "Close": 206.75 + }, + { + "Date": "2025-04-02", + "Open": 205.13, + "High": 205.3, + "Low": 204.89, + "Close": 205.03 + }, + { + "Date": "2025-04-03", + "Open": 204.62, + "High": 205.7, + "Low": 203.28, + "Close": 205.57 + }, + { + "Date": "2025-04-04", + "Open": 206.18, + "High": 207.23, + "Low": 204.98, + "Close": 206.03 + }, + { + "Date": "2025-04-07", + "Open": 207.74, + "High": 209.45, + "Low": 206.4, + "Close": 207.66 + }, + { + "Date": "2025-04-08", + "Open": 208.98, + "High": 209.29, + "Low": 207.81, + "Close": 209.03 + }, + { + "Date": "2025-04-09", + "Open": 207.83, + "High": 208.36, + "Low": 206.36, + "Close": 207.32 + }, + { + "Date": "2025-04-10", + "Open": 208.76, + "High": 209.78, + "Low": 208.08, + "Close": 209.55 + }, + { + "Date": "2025-04-11", + "Open": 211.32, + "High": 212.24, + "Low": 210.25, + "Close": 210.52 + }, + { + "Date": "2025-04-14", + "Open": 209.02, + "High": 209.1, + "Low": 208.82, + "Close": 208.9 + }, + { + "Date": "2025-04-15", + "Open": 208.19, + "High": 210.07, + "Low": 207.67, + "Close": 208.02 + }, + { + "Date": "2025-04-16", + "Open": 206.89, + "High": 206.91, + "Low": 206.49, + "Close": 206.57 + }, + { + "Date": "2025-04-17", + "Open": 207.69, + "High": 208.0, + "Low": 207.09, + "Close": 207.9 + }, + { + "Date": "2025-04-18", + "Open": 209.08, + "High": 210.92, + "Low": 208.09, + "Close": 209.23 + }, + { + "Date": "2025-04-21", + "Open": 207.32, + "High": 208.94, + "Low": 206.62, + "Close": 206.91 + }, + { + "Date": "2025-04-22", + "Open": 205.61, + "High": 207.41, + "Low": 203.83, + "Close": 206.05 + }, + { + "Date": "2025-04-23", + "Open": 205.79, + "High": 207.41, + "Low": 204.24, + "Close": 205.61 + }, + { + "Date": "2025-04-24", + "Open": 206.83, + "High": 207.27, + "Low": 206.48, + "Close": 206.77 + }, + { + "Date": "2025-04-25", + "Open": 208.7, + "High": 209.27, + "Low": 206.81, + "Close": 208.95 + }, + { + "Date": "2025-04-28", + "Open": 207.78, + "High": 208.79, + "Low": 206.42, + "Close": 207.66 + }, + { + "Date": "2025-04-29", + "Open": 207.19, + "High": 208.82, + "Low": 206.03, + "Close": 206.85 + }, + { + "Date": "2025-04-30", + "Open": 205.48, + "High": 207.14, + "Low": 203.65, + "Close": 205.97 + }, + { + "Date": "2025-05-01", + "Open": 207.46, + "High": 207.8, + "Low": 206.95, + "Close": 207.71 + }, + { + "Date": "2025-05-02", + "Open": 208.69, + "High": 210.44, + "Low": 208.09, + "Close": 208.85 + }, + { + "Date": "2025-05-05", + "Open": 206.89, + "High": 207.54, + "Low": 205.18, + "Close": 207.0 + }, + { + "Date": "2025-05-06", + "Open": 206.09, + "High": 206.99, + "Low": 205.08, + "Close": 206.5 + }, + { + "Date": "2025-05-07", + "Open": 207.6, + "High": 208.61, + "Low": 207.34, + "Close": 207.56 + }, + { + "Date": "2025-05-08", + "Open": 207.25, + "High": 208.68, + "Low": 206.94, + "Close": 208.42 + }, + { + "Date": "2025-05-09", + "Open": 210.13, + "High": 210.97, + "Low": 208.81, + "Close": 209.58 + }, + { + "Date": "2025-05-12", + "Open": 209.39, + "High": 211.16, + "Low": 208.3, + "Close": 208.59 + }, + { + "Date": "2025-05-13", + "Open": 207.77, + "High": 209.75, + "Low": 206.92, + "Close": 208.67 + }, + { + "Date": "2025-05-14", + "Open": 206.79, + "High": 208.59, + "Low": 206.41, + "Close": 206.84 + }, + { + "Date": "2025-05-15", + "Open": 206.3, + "High": 207.25, + "Low": 205.95, + "Close": 206.8 + }, + { + "Date": "2025-05-16", + "Open": 207.51, + "High": 207.67, + "Low": 207.46, + "Close": 207.53 + }, + { + "Date": "2025-05-19", + "Open": 206.48, + "High": 207.63, + "Low": 205.08, + "Close": 205.61 + }, + { + "Date": "2025-05-20", + "Open": 203.94, + "High": 204.3, + "Low": 203.02, + "Close": 204.24 + }, + { + "Date": "2025-05-21", + "Open": 205.51, + "High": 206.12, + "Low": 203.69, + "Close": 204.55 + }, + { + "Date": "2025-05-22", + "Open": 206.54, + "High": 207.86, + "Low": 205.79, + "Close": 207.52 + }, + { + "Date": "2025-05-23", + "Open": 206.62, + "High": 206.83, + "Low": 205.6, + "Close": 206.41 + }, + { + "Date": "2025-05-26", + "Open": 205.45, + "High": 206.31, + "Low": 205.24, + "Close": 206.04 + }, + { + "Date": "2025-05-27", + "Open": 205.84, + "High": 207.09, + "Low": 204.75, + "Close": 205.78 + }, + { + "Date": "2025-05-28", + "Open": 203.97, + "High": 204.23, + "Low": 203.95, + "Close": 204.23 + }, + { + "Date": "2025-05-29", + "Open": 202.26, + "High": 203.82, + "Low": 201.83, + "Close": 203.49 + }, + { + "Date": "2025-05-30", + "Open": 201.88, + "High": 203.77, + "Low": 199.91, + "Close": 201.62 + }, + { + "Date": "2025-06-02", + "Open": 201.67, + "High": 202.33, + "Low": 200.18, + "Close": 201.65 + }, + { + "Date": "2025-06-03", + "Open": 200.18, + "High": 202.16, + "Low": 198.46, + "Close": 200.46 + }, + { + "Date": "2025-06-04", + "Open": 199.98, + "High": 201.84, + "Low": 198.49, + "Close": 199.42 + }, + { + "Date": "2025-06-05", + "Open": 199.6, + "High": 201.07, + "Low": 199.46, + "Close": 200.74 + }, + { + "Date": "2025-06-06", + "Open": 202.07, + "High": 203.96, + "Low": 200.85, + "Close": 203.31 + }, + { + "Date": "2025-06-09", + "Open": 202.02, + "High": 203.92, + "Low": 200.35, + "Close": 202.19 + }, + { + "Date": "2025-06-10", + "Open": 200.88, + "High": 202.7, + "Low": 199.06, + "Close": 200.81 + }, + { + "Date": "2025-06-11", + "Open": 198.92, + "High": 199.22, + "Low": 198.67, + "Close": 198.98 + }, + { + "Date": "2025-06-12", + "Open": 200.04, + "High": 200.28, + "Low": 198.93, + "Close": 200.03 + }, + { + "Date": "2025-06-13", + "Open": 199.54, + "High": 199.56, + "Low": 199.37, + "Close": 199.46 + }, + { + "Date": "2025-06-16", + "Open": 200.74, + "High": 201.1, + "Low": 199.3, + "Close": 199.31 + }, + { + "Date": "2025-06-17", + "Open": 200.32, + "High": 202.23, + "Low": 198.89, + "Close": 201.73 + } +] \ No newline at end of file diff --git a/vue/src/ai-components/ai-chart/stock-chart.vue b/vue/src/ai-components/ai-chart/stock-chart.vue new file mode 100644 index 0000000..6219849 --- /dev/null +++ b/vue/src/ai-components/ai-chart/stock-chart.vue @@ -0,0 +1,417 @@ + + + + + + + diff --git a/vue/src/main.ts b/vue/src/main.ts index 5e002bc..f11287c 100644 --- a/vue/src/main.ts +++ b/vue/src/main.ts @@ -25,6 +25,8 @@ import GridPredictive from './ai-components/ai-grid/ai-predictive-entry.vue' import GanttTask from './ai-components/ai-gantt/ai-task-prioritizer.vue'; import GanttProgress from './ai-components/ai-gantt/ai-progress-predictor.vue'; import GanttResource from './ai-components/ai-gantt/ai-resource-manager.vue'; +import DataPreprocessing from './ai-components/ai-chart/data-preprocessing.vue'; +import StockForecastingChart from './ai-components/ai-chart/stock-chart.vue' const routes = [ { @@ -36,6 +38,20 @@ const routes = [ name: 'ComboBox', component: ComboBox }, + { + path: '/DataPreprocessing', + name: 'DataPreprocessing', + component:DataPreprocessing + }, + // { "id": 29, "name": "Data Preprocessing", "path": "/DataPreprocessing" }, + // { "id": 30, "name": "Stock Forcasting", "path": "/StockForcasting" } + + { + path: '/StockForcasting', + name: 'StockChart', + component:StockForecastingChart + }, + { path: '/DiagramFlowChart', name: 'DiagramFlowChart', diff --git a/vue/src/sample.json b/vue/src/sample.json index 81b7390..749e7ff 100644 --- a/vue/src/sample.json +++ b/vue/src/sample.json @@ -2,6 +2,7 @@ { "id": 1, "name": "Smart Paste", "path": "/SmartPaste" }, { "id": 2, "name": "Smart Text Area", "path": "/SmartTextArea" }, { "id": 3, "name": "ComboBox", "path": "/ComboBox" }, + { "id": 4, "name": "Schedule", "path": "/Schedule" }, { "id": 5, "name": "Rich Text Editor", "path": "/RTE" }, { "id": 6, "name": "Pivot Table", "path": "/Pivot" }, @@ -45,6 +46,14 @@ { "id": 25, "name": "Smart Task Prioritizer", "path": "/GanttTask" }, { "id": 26, "name": "Smart Progress Predictor", "path": "/GanttProgress" }, { "id": 27, "name": "Smart Resource Allocation", "path": "/GanttResource" } + ] +}, + { "id": 28, "name": "Chart", "expanded": true, + "children": [ + { "id": 29, "name": "Data Preprocessing", "path": "/DataPreprocessing" }, + { "id": 30, "name": "Stock Forcasting", "path": "/StockForcasting" } + + ] } ] \ No newline at end of file