From 988093e37b2ec7e0215609bce5445569a1a33612 Mon Sep 17 00:00:00 2001 From: Joe Ferrer Date: Wed, 1 Mar 2023 01:05:18 +1100 Subject: [PATCH 1/2] Move python files to datafeed dir --- requirements.txt => datafeed/requirements.txt | 0 server.py => datafeed/server3.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename requirements.txt => datafeed/requirements.txt (100%) rename server.py => datafeed/server3.py (100%) diff --git a/requirements.txt b/datafeed/requirements.txt similarity index 100% rename from requirements.txt rename to datafeed/requirements.txt diff --git a/server.py b/datafeed/server3.py similarity index 100% rename from server.py rename to datafeed/server3.py From 22231f8a4fd5c0c8fe4c4d746ba49d4c1983d489 Mon Sep 17 00:00:00 2001 From: Kishan-Ved Date: Fri, 14 Jul 2023 14:26:44 +0530 Subject: [PATCH 2/2] Fixes Task 3 --- .vscode/settings.json | 3 +++ package-lock.json | 18 +++++++++--------- package.json | 6 +++--- src/DataManipulator.ts | 32 ++++++++++++++++++++++---------- src/Graph.tsx | 30 ++++++++++++++++++------------ 5 files changed, 55 insertions(+), 34 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..cee4243f3d --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "iis.configDir": "" +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 8135a727a1..e45f37c7f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,12 +14,12 @@ "@finos/perspective-viewer-datagrid": "^1.6.2", "@types/jest": "^23.3.13", "@types/node": "^10.12.19", - "@types/react": "^16.9.0", + "@types/react": "^16.14.43", "@types/react-dom": "^16.0.11", "bootstrap": "^4.2.1", "puppeteer": "^1.19.0", - "react": "^16.9.0", - "react-dom": "^16.9.0", + "react": "^16.14.0", + "react-dom": "^16.14.0", "react-scripts": "2.1.3" }, "devDependencies": { @@ -2309,9 +2309,9 @@ "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" }, "node_modules/@types/react": { - "version": "16.14.29", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.29.tgz", - "integrity": "sha512-I5IwEaefGZbpmmK1J7zHwZe3JkGxcRkc5WJUDWmNySVVovueViRTEUWV7spTvpe96l3nbKD/K6+GxoN69CYb/w==", + "version": "16.14.43", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.43.tgz", + "integrity": "sha512-7zdjv7jvoLLQg1tTvpQsm+hyNUMT2mPlNV1+d0I8fbGhkJl82spopMyBlu4wb1dviZAxpGdk5eHu/muacknnfw==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -21978,9 +21978,9 @@ "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" }, "@types/react": { - "version": "16.14.29", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.29.tgz", - "integrity": "sha512-I5IwEaefGZbpmmK1J7zHwZe3JkGxcRkc5WJUDWmNySVVovueViRTEUWV7spTvpe96l3nbKD/K6+GxoN69CYb/w==", + "version": "16.14.43", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.43.tgz", + "integrity": "sha512-7zdjv7jvoLLQg1tTvpQsm+hyNUMT2mPlNV1+d0I8fbGhkJl82spopMyBlu4wb1dviZAxpGdk5eHu/muacknnfw==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", diff --git a/package.json b/package.json index 8ca3a60d78..8041d04e21 100644 --- a/package.json +++ b/package.json @@ -9,12 +9,12 @@ "@finos/perspective-viewer-datagrid": "^1.6.2", "@types/jest": "^23.3.13", "@types/node": "^10.12.19", - "@types/react": "^16.9.0", + "@types/react": "^16.14.43", "@types/react-dom": "^16.0.11", "bootstrap": "^4.2.1", "puppeteer": "^1.19.0", - "react": "^16.9.0", - "react-dom": "^16.9.0", + "react": "^16.14.0", + "react-dom": "^16.14.0", "react-scripts": "2.1.3" }, "scripts": { diff --git a/src/DataManipulator.ts b/src/DataManipulator.ts index 7f622955cc..f772f2a625 100644 --- a/src/DataManipulator.ts +++ b/src/DataManipulator.ts @@ -1,20 +1,32 @@ import { ServerRespond } from './DataStreamer'; export interface Row { - stock: string, - top_ask_price: number, + price_abc: number, + price_def: number, + ratio: number, timestamp: Date, + upper_bound: number, + lower_bound: number, + trigger_alert: number | undefined, } export class DataManipulator { - static generateRow(serverResponds: ServerRespond[]) { - return serverResponds.map((el: any) => { - return { - stock: el.stock, - top_ask_price: el.top_ask && el.top_ask.price || 0, - timestamp: el.timestamp, - }; - }) + static generateRow(serverRespond: ServerRespond[]): Row { + const priceABC = (serverRespond[0].top_ask.price + serverRespond[0].top_bid.price)/2; + const priceDEF = (serverRespond[1].top_ask.price + serverRespond[1].top_bid.price)/2; + const ratio = priceABC/priceDEF; + const upperBound = 1 + 0.05; + const lowerBound = 1 - 0.05; + return { + price_abc: priceABC, + price_def: priceDEF, + ratio, + timestamp: serverRespond[0].timestamp > serverRespond[1].timestamp ? + serverRespond[0].timestamp : serverRespond[1].timestamp, + upper_bound: upperBound, + lower_bound: lowerBound, + trigger_alert: (ratio > upperBound || ratio < lowerBound) ? ratio : undefined, + }; } } diff --git a/src/Graph.tsx b/src/Graph.tsx index 277797d933..d73b5bd212 100644 --- a/src/Graph.tsx +++ b/src/Graph.tsx @@ -1,9 +1,10 @@ -import React, { Component } from 'react'; +import React from 'react'; import { Table } from '@finos/perspective'; import { ServerRespond } from './DataStreamer'; import { DataManipulator } from './DataManipulator'; import './Graph.css'; + interface IProps { data: ServerRespond[], } @@ -11,7 +12,7 @@ interface IProps { interface PerspectiveViewerElement extends HTMLElement { load: (table: Table) => void, } -class Graph extends Component { +class Graph extends React.Component { table: Table | undefined; render() { @@ -23,10 +24,13 @@ class Graph extends Component { const elem = document.getElementsByTagName('perspective-viewer')[0] as unknown as PerspectiveViewerElement; const schema = { - stock: 'string', - top_ask_price: 'float', - top_bid_price: 'float', + price_abc: 'float', + price_def: 'float', + ratio: 'float', timestamp: 'date', + upper_bound: 'float', + lower_bound: 'float', + trigger_alert: 'float', }; if (window.perspective && window.perspective.worker()) { @@ -36,23 +40,25 @@ class Graph extends Component { // Load the `table` in the `` DOM reference. elem.load(this.table); elem.setAttribute('view', 'y_line'); - elem.setAttribute('column-pivots', '["stock"]'); elem.setAttribute('row-pivots', '["timestamp"]'); - elem.setAttribute('columns', '["top_ask_price"]'); + elem.setAttribute('columns', '["ratio","lower_bound","upper_bound","trigger_alert"]'); elem.setAttribute('aggregates', JSON.stringify({ - stock: 'distinctcount', - top_ask_price: 'avg', - top_bid_price: 'avg', + price_abc: 'avg', + price_def: 'avg', + ratio: 'avg', timestamp: 'distinct count', + upper_bound: 'avg', + lower_bound: 'avg', + trigger_alert: 'avg', })); } } componentDidUpdate() { if (this.table) { - this.table.update( + this.table.update([ DataManipulator.generateRow(this.props.data), - ); + ] as unknown as 'TableData'); } } }