@xyo-network/diviner-forecasting-method-arima 2.55.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.tsconfig.build.cjs.json +31 -0
- package/.tsconfig.build.esm.json +31 -0
- package/dist/.tsconfig.build.cjs.tsbuildinfo +1 -0
- package/dist/.tsconfig.build.esm.tsbuildinfo +1 -0
- package/dist/cjs/arima/configurable/configurableArima.js +26 -0
- package/dist/cjs/arima/configurable/configurableArima.js.map +1 -0
- package/dist/cjs/arima/configurable/index.js +5 -0
- package/dist/cjs/arima/configurable/index.js.map +1 -0
- package/dist/cjs/arima/configured/arima.js +8 -0
- package/dist/cjs/arima/configured/arima.js.map +1 -0
- package/dist/cjs/arima/configured/index.js +6 -0
- package/dist/cjs/arima/configured/index.js.map +1 -0
- package/dist/cjs/arima/configured/seasonalArima.js +8 -0
- package/dist/cjs/arima/configured/seasonalArima.js.map +1 -0
- package/dist/cjs/arima/index.js +6 -0
- package/dist/cjs/arima/index.js.map +1 -0
- package/dist/cjs/index.js +5 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/docs.json +542 -0
- package/dist/esm/arima/configurable/configurableArima.js +21 -0
- package/dist/esm/arima/configurable/configurableArima.js.map +1 -0
- package/dist/esm/arima/configurable/index.js +2 -0
- package/dist/esm/arima/configurable/index.js.map +1 -0
- package/dist/esm/arima/configured/arima.js +5 -0
- package/dist/esm/arima/configured/arima.js.map +1 -0
- package/dist/esm/arima/configured/index.js +3 -0
- package/dist/esm/arima/configured/index.js.map +1 -0
- package/dist/esm/arima/configured/seasonalArima.js +5 -0
- package/dist/esm/arima/configured/seasonalArima.js.map +1 -0
- package/dist/esm/arima/index.js +3 -0
- package/dist/esm/arima/index.js.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/types/arima/configurable/configurableArima.d.ts +10 -0
- package/dist/types/arima/configurable/configurableArima.d.ts.map +1 -0
- package/dist/types/arima/configurable/index.d.ts +2 -0
- package/dist/types/arima/configurable/index.d.ts.map +1 -0
- package/dist/types/arima/configured/arima.d.ts +5 -0
- package/dist/types/arima/configured/arima.d.ts.map +1 -0
- package/dist/types/arima/configured/index.d.ts +3 -0
- package/dist/types/arima/configured/index.d.ts.map +1 -0
- package/dist/types/arima/configured/seasonalArima.d.ts +5 -0
- package/dist/types/arima/configured/seasonalArima.d.ts.map +1 -0
- package/dist/types/arima/index.d.ts +3 -0
- package/dist/types/arima/index.d.ts.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/package.json +40 -0
- package/src/arima/configurable/configurableArima.ts +25 -0
- package/src/arima/configurable/index.ts +1 -0
- package/src/arima/configured/arima.ts +9 -0
- package/src/arima/configured/index.ts +2 -0
- package/src/arima/configured/seasonalArima.ts +9 -0
- package/src/arima/configured/spec/arima.spec.ts +20 -0
- package/src/arima/configured/spec/seasonalArima.spec.ts +19 -0
- package/src/arima/configured/spec/tsconfig.json +3 -0
- package/src/arima/index.ts +2 -0
- package/src/index.ts +1 -0
- package/src/types/index.d.ts +46 -0
- package/tsconfig.json +12 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/arima/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json.schemastore.org/package.json",
|
|
3
|
+
"name": "@xyo-network/diviner-forecasting-method-arima",
|
|
4
|
+
"publishConfig": {
|
|
5
|
+
"access": "public"
|
|
6
|
+
},
|
|
7
|
+
"version": "2.55.5",
|
|
8
|
+
"description": "XYO Archivist",
|
|
9
|
+
"sideeffects": false,
|
|
10
|
+
"engines": {
|
|
11
|
+
"node": ">=16 <17"
|
|
12
|
+
},
|
|
13
|
+
"esm5": "dist/esm/index.js",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"esm5": "./dist/esm/index.js",
|
|
17
|
+
"node": {
|
|
18
|
+
"import": "./dist/cjs/index.js",
|
|
19
|
+
"require": "./dist/cjs/index.js"
|
|
20
|
+
},
|
|
21
|
+
"default": "./dist/esm/index.js"
|
|
22
|
+
},
|
|
23
|
+
"./package.json": "./package.json"
|
|
24
|
+
},
|
|
25
|
+
"main": "dist/cjs/index.js",
|
|
26
|
+
"module": "dist/esm/index.js",
|
|
27
|
+
"author": "Arie Trouw",
|
|
28
|
+
"license": "LGPL-3.0",
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@xyo-network/forecasting-diviner-model": "^2.55.5",
|
|
31
|
+
"@xyo-network/payload-model": "^2.55.5",
|
|
32
|
+
"arima": "^0.2.5"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@xylabs/ts-scripts-yarn3": "^2.16.5",
|
|
36
|
+
"@xylabs/tsconfig": "^2.16.5",
|
|
37
|
+
"typescript": "^4.9.5"
|
|
38
|
+
},
|
|
39
|
+
"types": "dist/types/index.d.ts"
|
|
40
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Forecast, ForecastingMethod, PayloadValueTransformer } from '@xyo-network/forecasting-diviner-model'
|
|
2
|
+
import { Payload } from '@xyo-network/payload-model'
|
|
3
|
+
import ARIMA, { ARIMAOptions } from 'arima'
|
|
4
|
+
|
|
5
|
+
export const commonOpts: ARIMAOptions = { verbose: false }
|
|
6
|
+
|
|
7
|
+
export type PredictionPayload = Payload<{ error?: number; value: number }>
|
|
8
|
+
|
|
9
|
+
export const configurableArima = (opts: ARIMAOptions = commonOpts, predictionSteps = 10): ForecastingMethod => {
|
|
10
|
+
return (payloads: Payload[], transformer: PayloadValueTransformer): Forecast[] => {
|
|
11
|
+
// If there's no input, there's no prediction
|
|
12
|
+
if (payloads.length === 0) return []
|
|
13
|
+
// Transform all the values
|
|
14
|
+
const values = payloads.map(transformer)
|
|
15
|
+
// Train a model on the training set
|
|
16
|
+
const model = new ARIMA({ ...commonOpts, ...opts }).train(values)
|
|
17
|
+
// Use the trained model to predict the next N values
|
|
18
|
+
const predictions = model.predict(predictionSteps)
|
|
19
|
+
// Convert the predictions into payloads
|
|
20
|
+
return predictions[0].map((value, index) => {
|
|
21
|
+
const error = predictions[1][index]
|
|
22
|
+
return { error, value }
|
|
23
|
+
})
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './configurableArima'
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ForecastingMethod } from '@xyo-network/forecasting-diviner-model'
|
|
2
|
+
|
|
3
|
+
import { configurableArima } from '../configurable'
|
|
4
|
+
|
|
5
|
+
export const arimaOpts: ARIMAOptions = { d: 1, p: 2, q: 2 }
|
|
6
|
+
|
|
7
|
+
export const arimaForecastingName = 'arimaForecasting'
|
|
8
|
+
|
|
9
|
+
export const arimaForecastingMethod: ForecastingMethod = configurableArima(arimaOpts)
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ForecastingMethod } from '@xyo-network/forecasting-diviner-model'
|
|
2
|
+
|
|
3
|
+
import { configurableArima } from '../configurable'
|
|
4
|
+
|
|
5
|
+
export const seasonalArimaOpts: ARIMAOptions = { D: 0, P: 1, Q: 1, d: 1, p: 2, q: 2, s: 12 }
|
|
6
|
+
|
|
7
|
+
export const seasonalArimaForecastingName = 'seasonalArimaForecasting'
|
|
8
|
+
|
|
9
|
+
export const seasonalArimaForecastingMethod: ForecastingMethod = configurableArima(seasonalArimaOpts)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Payload } from '@xyo-network/payload-model'
|
|
2
|
+
|
|
3
|
+
import { arimaForecastingMethod } from '../arima'
|
|
4
|
+
|
|
5
|
+
const transformer = (payload: Payload) => (payload as Payload<{ data: number }>)?.data || NaN
|
|
6
|
+
|
|
7
|
+
describe('arimaForecasting', () => {
|
|
8
|
+
it('should forecast', async () => {
|
|
9
|
+
const actual: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
|
10
|
+
const expected: number[] = [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
|
|
11
|
+
const payloads = actual.map((data) => {
|
|
12
|
+
return { data, schema: 'network.xyo.test' }
|
|
13
|
+
})
|
|
14
|
+
const result = await arimaForecastingMethod(payloads, transformer)
|
|
15
|
+
expect(result).toBeTruthy()
|
|
16
|
+
result.map((payload, index) => {
|
|
17
|
+
expect((payload as { schema: string; value: number }).value).toBeCloseTo(expected[index])
|
|
18
|
+
})
|
|
19
|
+
})
|
|
20
|
+
})
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Payload } from '@xyo-network/payload-model'
|
|
2
|
+
|
|
3
|
+
import { seasonalArimaForecastingMethod } from '../seasonalArima'
|
|
4
|
+
|
|
5
|
+
const twoPi = 2 * Math.PI
|
|
6
|
+
|
|
7
|
+
const transformer = (payload: Payload) => (payload as Payload<{ data: number }>)?.data || NaN
|
|
8
|
+
|
|
9
|
+
describe('seasonalArimaForecasting', () => {
|
|
10
|
+
it('should forecast', async () => {
|
|
11
|
+
const length = 10
|
|
12
|
+
const actual: number[] = Array.from({ length }, (_, i) => (i / (length - 1)) * twoPi).map((x) => Math.sin(x) + 1)
|
|
13
|
+
const payloads = actual.map((data) => {
|
|
14
|
+
return { data, schema: 'network.xyo.test' }
|
|
15
|
+
})
|
|
16
|
+
const result = await seasonalArimaForecastingMethod(payloads, transformer)
|
|
17
|
+
expect(result).toBeArray()
|
|
18
|
+
})
|
|
19
|
+
})
|
package/src/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './arima'
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/member-ordering */
|
|
2
|
+
|
|
3
|
+
declare type ARIMAMethod =
|
|
4
|
+
| 0 // Exact Maximum Likelihood Method (Default)
|
|
5
|
+
| 1 // Conditional Method - Sum Of Squares
|
|
6
|
+
| 2 // Box-Jenkins Method
|
|
7
|
+
|
|
8
|
+
declare type OptimizationMethod =
|
|
9
|
+
| 0 // Nelder-Mead
|
|
10
|
+
| 1 // Newton Line Search
|
|
11
|
+
| 2 // Newton Trust Region - Hook Step
|
|
12
|
+
| 3 // Newton Trust Region - Double Dog-Leg
|
|
13
|
+
| 4 // Conjugate Gradient
|
|
14
|
+
| 5 // BFGS
|
|
15
|
+
| 6 // Limited Memory BFGS (Default)
|
|
16
|
+
| 7 // BFGS Using More Thuente Method
|
|
17
|
+
|
|
18
|
+
declare interface ARIMAOptions {
|
|
19
|
+
auto?: boolean // automatic ARIMA (default: false)
|
|
20
|
+
// params for ARIMA (default: p: 1, d: 0, q: 1)
|
|
21
|
+
p?: number
|
|
22
|
+
d?: number
|
|
23
|
+
q?: number
|
|
24
|
+
// seasonal params (default: 0s). Setting them to non-zero values makes the ARIMA model seasonal
|
|
25
|
+
P?: number
|
|
26
|
+
D?: number
|
|
27
|
+
Q?: number
|
|
28
|
+
s?: number
|
|
29
|
+
method?: ARIMAMethod // ARIMA method (default: 0)
|
|
30
|
+
optimizer?: OptimizationMethod // optimization method (default: 6)
|
|
31
|
+
transpose?: boolean //transpose exogenous array when fitting SARIMAX (default: false)
|
|
32
|
+
verbose?: boolean // verbose output (default: true)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
declare type PredictionResult = [predictions: number[], meanSquareErrors: number[]]
|
|
36
|
+
|
|
37
|
+
declare module 'arima' {
|
|
38
|
+
export { ARIMAMethod, ARIMAOptions, OptimizationMethod, PredictionResult }
|
|
39
|
+
|
|
40
|
+
// eslint-disable-next-line import/no-default-export
|
|
41
|
+
export default class ARIMA {
|
|
42
|
+
constructor(options: ARIMAOptions)
|
|
43
|
+
predict(steps: number): PredictionResult
|
|
44
|
+
train(data: number[]): this
|
|
45
|
+
}
|
|
46
|
+
}
|