Socket
Socket
Sign inDemoInstall

@apio/timeframes

Package Overview
Dependencies
4
Maintainers
2
Versions
36
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 0.1.35 to 0.1.37

102

build/main/lib/timeframe.d.ts

@@ -1,3 +0,3 @@

import { TimeSerie } from './timeserie';
import { AggregationConfiguration, DateLike, FromTimeseriesOptions, Index, Metadata, PointValue, ReindexOptions, Row, TelemetryV1Output, TimeFrameInternal, PartitionOptions, TimeFrameResampleOptions, TimeframeRowsIterator, TimeserieIterator, TimeFrameReduceOptions, ProjectionOptions, PipelineStage } from './types';
import { TimeSerie } from "./timeserie";
import { AggregationConfiguration, DateLike, FromTimeseriesOptions, Index, Metadata, ReindexOptions, Row, TelemetryV1Output, PartitionOptions, TimeFrameResampleOptions, TimeframeRowsIterator, TimeserieIterator, TimeFrameReduceOptions, ProjectionOptions, PipelineStage, SplitOptions, BetweenTimeOptions } from "./types";
interface TimeFrameOptions {

@@ -16,2 +16,3 @@ data: Row[];

private _indexes;
private _columns;
/**

@@ -23,8 +24,8 @@ * Creates a Timeframe instance from a list of rows. It infers the list of column names from each row's fields.

constructor(options: TimeFrameOptions);
private buildTimeCheckpoints;
private buildTimeTree;
/**
* Creates a new timeframe preserving the metadata but replacing data
* @param data The new data to recreate the serie from
* @returns
*/
* Creates a new timeframe preserving the metadata but replacing data
* @param data The new data to recreate the serie from
* @returns
*/
recreate(data: Row[]): TimeFrame;

@@ -46,13 +47,11 @@ /**

/**
*
* Creates a TimeFrame from a Telemetry Output Object (Apio private method)
* @param data An object which is telemetry V1 output (Apio Internal)
* @returns
*/
static fromTelemetryV1Output(data?: TelemetryV1Output, metadata?: Metadata): TimeFrame;
static fromInternalFormat(data: TimeFrameInternal, metadata?: Metadata): TimeFrame;
private static fromInternalFormat;
/**
*
* Returns a new TimeFrame, where each input timeserie is used as column
* @param timeseries An array of TimeSerie objects
* @param options.fill Value to use as filler when a column does not hold a value for a specific time
* @returns A new TimeFrame, where each timeserie represent a column
*/

@@ -67,2 +66,8 @@ static fromTimeseries(timeseries: TimeSerie[], options?: FromTimeseriesOptions): TimeFrame;

/**
* Merges together rows and columns of the specified timeframes.
* If two or more timeframes present a value for the same column at the same time, the first timeframe in the array has priority.
* @param timeframes Array of timeframes to merge
*/
static merge(timeframes: TimeFrame[]): TimeFrame;
/**
* Joins multiple timeframes by adding the columns together and merging indexes (time)

@@ -80,13 +85,17 @@ * @param timeframes Array of timeframes to join together

/**
*
* Returns the column as timeseries
* @param name The name of the wanted column
* @returns The column as timeseries
*/
column(name: string): TimeSerie;
/**
* Returns every column as array of timeseries
*/
columns(): TimeSerie[];
/**
*
* @returns Array of rows
* Returns all the rows in an array
*/
rows(): Row[];
/**
* Returns the time index array
*/
indexes(): DateLike[];

@@ -98,27 +107,27 @@ /**

/**
*
* Returns a row at a given time or null
* @param time
* @returns A row at a given time or null
*/
atTime(time: string): Row | null;
/**
*
* @returns The row at the given index (position, not time)
* Get the row at the given index (position, not time)
*/
atIndex(index: number): PointValue;
atIndex(index: number): Row;
/**
* Returns the number of rows
*/
length(): number;
/**
* Returns the shape of the timeframe
* @returns Array<Number> The shape of the timeframe expressed as [rows, columns] where columns excludes the time column
* Returns the shape of the timeframe expressed as [rows, columns] where columns excludes the time column
*/
shape(): number[];
/**
*
* @returns The first row
*/
*
* Returns the first row
*/
first(): Row;
/**
*
* @returns The last row
*/
*
* Returns the last row
*/
last(): Row;

@@ -154,11 +163,7 @@ /**

/**
*
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
* @returns The subset of points between the two dates. Extremes are included.
*/
betweenTime(from: DateLike, to: DateLike, options?: {
includeInferior: boolean;
includeSuperior: boolean;
}): TimeFrame;
* Returns the subset of points between the two dates. Extremes are included.
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
*/
betweenTime(from: DateLike, to: DateLike, options?: BetweenTimeOptions): TimeFrame;
/**

@@ -175,3 +180,3 @@ * Applies transformations to TimeFrame. Each transformation is defined as an operation between columns. Allows, for example, to

* tf = tf.aggregate({ output: 'power1', columns: ['voltage1', 'current1'], operation: 'mul' })
* .aggregate({ output: 'power', columns: ['power1', 'power2', 'power3'], operation: 'add'})
* .aggregate({ output: 'power', columns: ['power1', 'power2', 'power3'], operation: 'add'})
*/

@@ -188,2 +193,7 @@ aggregate(agg: AggregationConfiguration): TimeFrame;

reduce(options: TimeFrameReduceOptions): TimeFrame;
/**
* Resamples the timeframe by the specified time interval. Each row
* of the result TimeFrame will be the result of the selected aggregation.
* @param options
*/
resample(options: TimeFrameResampleOptions): TimeFrame;

@@ -197,6 +207,6 @@ /**

/**
* Returns a new timeframe where each **row** is mapped by the iterator function. For mapping over columns, use apply()
* @param fn Iterator function
* @returns {TimeFrame}
*/
* Returns a new timeframe where each **row** is mapped by the iterator function. For mapping over columns, use apply()
* @param fn Iterator function
* @returns {TimeFrame}
*/
map(fn: TimeframeRowsIterator): TimeFrame;

@@ -213,6 +223,10 @@ /**

* @param options
* @returns
*/
partition(options: PartitionOptions): TimeFrame[];
/**
* Splits a timeframe into multiple timeframes where each timeframe has
* a maximum of `options.chunks` rows.
*/
split(options: SplitOptions): TimeFrame[];
/**
* Runs a series of transformations defined as an object. Useful in automation.

@@ -219,0 +233,0 @@ * A stage is an object with a single key and a value, the key is the name of the method, the value is the params object

@@ -21,2 +21,3 @@ "use strict";

};
const makeTree = require("functional-red-black-tree");
/**

@@ -36,2 +37,3 @@ * @class TimeFrame

this.metadata = {};
this._columns = {};
const { data, metadata = {} } = options;

@@ -45,7 +47,7 @@ // get a list of unique column names excluding the time key

else {
this.columnNames = [...new Set(data
this.columnNames = [
...new Set(data
.filter((row) => !!row)
.map((row) => Object.keys(row))
.flat())]
.filter((name) => name !== 'time');
.flatMap((row) => Object.keys(row))),
].filter((name) => name !== "time");
this.data = data

@@ -66,3 +68,6 @@ .concat([])

const { time, ...rest } = row;
acc[row.time] ? acc[row.time] = { ...acc[row.time], ...rest } : acc[row.time] = rest;
const fTime = utils_1.DateLikeToString(time);
acc[fTime]
? (acc[fTime] = { ...acc[fTime], ...rest })
: (acc[fTime] = rest);
return acc;

@@ -73,21 +78,22 @@ }, {});

time: Object.keys(this.data).sort(),
checkpoints: null
tree: null,
};
}
buildTimeCheckpoints() {
if (!this._indexes.checkpoints) {
this._indexes.checkpoints = {};
const o = utils_1.getOrderOfMagnitude(this._indexes.time.length);
this._indexes.time.forEach((el, i) => {
if (i % (o / 100) === 0) {
this._indexes.checkpoints[el] = i;
}
buildTimeTree() {
if (!this._indexes.tree) {
let tree = makeTree(function (a, b) {
return a - b;
});
this._indexes.time.forEach((time) => {
const t = new Date(time).getTime();
tree = tree.insert(t, t);
});
this._indexes.tree = tree;
}
}
/**
* Creates a new timeframe preserving the metadata but replacing data
* @param data The new data to recreate the serie from
* @returns
*/
* Creates a new timeframe preserving the metadata but replacing data
* @param data The new data to recreate the serie from
* @returns
*/
recreate(data) {

@@ -117,5 +123,4 @@ return new TimeFrame({ data, metadata: this.metadata });

/**
*
* Creates a TimeFrame from a Telemetry Output Object (Apio private method)
* @param data An object which is telemetry V1 output (Apio Internal)
* @returns
*/

@@ -128,3 +133,3 @@ static fromTelemetryV1Output(data = {}, metadata = {}) {

if (!_data[time]) {
_data[time] = {};
_data[utils_1.DateLikeToString(time)] = {};
}

@@ -134,5 +139,5 @@ const column = `${deviceId}:${propertyName}`;

deviceId,
propertyName
propertyName,
};
_data[time][column] = value;
_data[utils_1.DateLikeToString(time)][column] = value;
}

@@ -142,3 +147,3 @@ }

const rows = Object.keys(_data).map((time) => {
return { time, ..._data[time] };
return { time, ..._data[utils_1.DateLikeToString(time)] };
});

@@ -154,6 +159,5 @@ return new TimeFrame({ data: rows, metadata });

/**
*
* Returns a new TimeFrame, where each input timeserie is used as column
* @param timeseries An array of TimeSerie objects
* @param options.fill Value to use as filler when a column does not hold a value for a specific time
* @returns A new TimeFrame, where each timeserie represent a column
*/

@@ -163,9 +167,10 @@ static fromTimeseries(timeseries, options) {

const metadata = {};
timeseries.forEach(ts => {
const idx = [...new Set(timeseries.flatMap((ts) => ts.indexes()))];
timeseries.forEach((ts) => {
metadata[ts.name] = ts.metadata;
ts.toArray().forEach((point) => {
data[point[0]] = data[point[0]] || {};
data[point[0]][ts.name] = point[1] || (options === null || options === void 0 ? void 0 : options.fill) || null;
});
});
idx.forEach((i) => {
data[i] = {};
timeseries.forEach((ts) => (data[i][ts.name] = ts.atTime(i) || (options === null || options === void 0 ? void 0 : options.fill) || null));
});
return TimeFrame.fromInternalFormat(data, metadata);

@@ -180,7 +185,18 @@ }

return new TimeFrame({
metadata: Object.assign({}, ...timeframes.map(tf => tf.metadata)),
data: timeframes.map((tf) => tf.rows()).flat()
metadata: Object.assign({}, ...timeframes.map((tf) => tf.metadata)),
data: timeframes.flatMap((tf) => tf.rows()),
});
}
/**
* Merges together rows and columns of the specified timeframes.
* If two or more timeframes present a value for the same column at the same time, the first timeframe in the array has priority.
* @param timeframes Array of timeframes to merge
*/
static merge(timeframes) {
if (timeframes.length < 2) {
throw new Error("merge() requires at least two timeframes");
}
return timeframes[0].join(timeframes.slice(1));
}
/**
* Joins multiple timeframes by adding the columns together and merging indexes (time)

@@ -191,3 +207,16 @@ * @param timeframes Array of timeframes to join together

join(timeframes) {
return TimeFrame.fromInternalFormat(Object.assign({}, ...(timeframes.map(tf => tf.data).concat([this.data]))));
const allTf = timeframes.concat([this]);
// Todo should support a filler value, at the moment it just does not define values in rows
// when a row misses a certain column's value
// const allColumns: string[] = [
// ...new Set(allTf.flatMap((tf) => tf.columnNames)),
// ];
const mergedIndex = [...new Set(allTf.flatMap((tf) => tf.indexes()))];
const rows = mergedIndex.map((idx) => ({
time: idx,
...allTf
.map((tf) => tf.atTime(idx))
.reduce((prev, acc) => Object.assign(acc, prev), this.atTime(idx)),
}));
return this.recreate(rows);
}

@@ -203,5 +232,4 @@ /**

/**
*
* Returns the column as timeseries
* @param name The name of the wanted column
* @returns The column as timeseries
*/

@@ -212,6 +240,16 @@ column(name) {

}
const data = Object.entries(this.data).map(([time, values]) => ([time, values[name]]));
const metadata = this.metadata[name] || {};
return new timeserie_1.TimeSerie(name, data, metadata);
// we cache the column to make subsequent reads faster
if (!this._columns[name]) {
const data = Object.entries(this.data).map(([time, values]) => [
time,
values[name],
]);
const metadata = this.metadata[name] || {};
this._columns[name] = new timeserie_1.TimeSerie(name, data, metadata);
}
return this._columns[name];
}
/**
* Returns every column as array of timeseries
*/
columns() {

@@ -221,8 +259,13 @@ return this.columnNames.map((column) => this.column(column));

/**
*
* @returns Array of rows
* Returns all the rows in an array
*/
rows() {
return Object.entries(this.data).map(([time, values]) => ({ time, ...values }));
return Object.entries(this.data).map(([time, values]) => ({
time,
...values,
}));
}
/**
* Returns the time index array
*/
indexes() {

@@ -237,3 +280,3 @@ return this._indexes.time;

if (nonExisting.length > 0) {
throw new Error(`Non existing columns ${nonExisting.join(',')}`);
throw new Error(`Non existing columns ${nonExisting.join(",")}`);
}

@@ -245,19 +288,20 @@ const tf = TimeFrame.fromTimeseries(config.columns.map((columnName) => this.column(columnName)));

/**
*
* Returns a row at a given time or null
* @param time
* @returns A row at a given time or null
*/
atTime(time) {
return { time, ...this.data[time] } || null;
return { time, ...this.data[utils_1.DateLikeToString(time)] } || null;
}
/**
*
* @returns The row at the given index (position, not time)
* Get the row at the given index (position, not time)
*/
atIndex(index) {
if (index >= this.rows().length) {
throw new Error('Index out of bounds');
throw new Error("Index out of bounds");
}
return this.rows()[index];
}
/**
* Returns the number of rows
*/
length() {

@@ -267,4 +311,3 @@ return this._indexes.time.length;

/**
* Returns the shape of the timeframe
* @returns Array<Number> The shape of the timeframe expressed as [rows, columns] where columns excludes the time column
* Returns the shape of the timeframe expressed as [rows, columns] where columns excludes the time column
*/

@@ -275,5 +318,5 @@ shape() {

/**
*
* @returns The first row
*/
*
* Returns the first row
*/
first() {

@@ -287,5 +330,5 @@ var _a;

/**
*
* @returns The last row
*/
*
* Returns the last row
*/
last() {

@@ -306,3 +349,6 @@ if (this.length() === 0) {

const time = this.first().time;
return this.columns().reduce((acc, column) => { acc[column.name] = column.sum()[1]; return acc; }, { time });
return this.columns().reduce((acc, column) => {
acc[column.name] = column.sum()[1];
return acc;
}, { time });
}

@@ -317,3 +363,6 @@ /**

const time = this.first().time;
return this.columns().reduce((acc, column) => { acc[column.name] = column.avg()[1]; return acc; }, { time });
return this.columns().reduce((acc, column) => {
acc[column.name] = column.avg()[1];
return acc;
}, { time });
}

@@ -328,3 +377,6 @@ /**

const time = this.first().time;
return this.columns().reduce((acc, column) => { acc[column.name] = column.delta()[1]; return acc; }, { time });
return this.columns().reduce((acc, column) => {
acc[column.name] = column.delta()[1];
return acc;
}, { time });
}

@@ -339,3 +391,6 @@ /**

const time = this.first().time;
return this.columns().reduce((acc, column) => { acc[column.name] = column.max()[1]; return acc; }, { time });
return this.columns().reduce((acc, column) => {
acc[column.name] = column.max()[1];
return acc;
}, { time });
}

@@ -350,3 +405,6 @@ /**

const time = this.first().time;
return this.columns().reduce((acc, column) => { acc[column.name] = column.min()[1]; return acc; }, { time });
return this.columns().reduce((acc, column) => {
acc[column.name] = column.min()[1];
return acc;
}, { time });
}

@@ -366,40 +424,27 @@ /**

/**
*
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
* @returns The subset of points between the two dates. Extremes are included.
*/
betweenTime(from, to, options = { includeInferior: true, includeSuperior: true }) {
* Returns the subset of points between the two dates. Extremes are included.
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
*/
betweenTime(from, to, options = {
includeInferior: true,
includeSuperior: true,
}) {
/**
* Here we might have to scan a huge sorted array. To prevent scanning too many useless keys
* we index the array by mapping a certain number of timestamps to positions in the time index.
*
* This sparse index is smaller than the full index and fester to use for scanning ranges like in this case.
* Here we might have to scan a huge sorted array. To prevent scanning too many useless keys. To get better performances we index timestamps with a RBtree in the buildTimeTree funciton
*/
this.buildTimeCheckpoints();
this.buildTimeTree();
const { includeInferior, includeSuperior } = options;
const f = new Date(from).getTime();
const t = new Date(to).getTime();
const keys = Object.keys(this._indexes.checkpoints);
// Indice della prima chiave che va oltre il from
const startingPointValueIndex = keys.findIndex((key) => new Date(key).getTime() > from);
// Ultimo timestamp prima di quell'indice
let startingPoint = this._indexes.checkpoints[keys[startingPointValueIndex - 1]];
if (!startingPoint) {
// Siamo oltre l'ultimo checkpoint
const lastCheckpoint = keys[keys.length - 1];
startingPoint = this._indexes.checkpoints[lastCheckpoint];
}
const goodRows = [];
for (let i = startingPoint; i < this._indexes.time.length; i++) {
const curr = new Date(this._indexes.time[i]).getTime();
if (curr < f) {
continue;
const iter = this._indexes.tree.ge(f);
while (iter && new Date(iter.key).getTime() <= t) {
if (test(iter.key, f, t, includeSuperior, includeInferior)) {
goodRows.push({
time: new Date(iter.key).toISOString(),
...this.data[utils_1.DateLikeToString(iter.key)],
});
}
if (curr > t) {
break;
}
if (test(curr, f, t, includeSuperior, includeInferior)) {
goodRows.push({ time: this._indexes.time[i], ...this.data[this._indexes.time[i]] });
}
iter.next();
}

@@ -419,3 +464,3 @@ return this.recreate(goodRows);

* tf = tf.aggregate({ output: 'power1', columns: ['voltage1', 'current1'], operation: 'mul' })
* .aggregate({ output: 'power', columns: ['power1', 'power2', 'power3'], operation: 'add'})
* .aggregate({ output: 'power', columns: ['power1', 'power2', 'power3'], operation: 'add'})
*/

@@ -427,10 +472,11 @@ aggregate(agg) {

let newColumn;
if (typeof agg.operation === 'function') {
if (typeof agg.operation === "function") {
newColumn = timeserie_1.TimeSerie.internals.combine(columnsToAggregate, agg.operation, { name: agg.output });
}
else if (typeof agg.operation === 'string' && agg.operation in timeserie_1.TimeSerie.internals.combiners) {
else if (typeof agg.operation === "string" &&
agg.operation in timeserie_1.TimeSerie.internals.combiners) {
newColumn = timeserie_1.TimeSerie.internals.combine(columnsToAggregate, timeserie_1.TimeSerie.internals.combiners[agg.operation], { name: agg.output });
}
else {
throw new Error('Wrong type for aggregation operation');
throw new Error("Wrong type for aggregation operation");
}

@@ -457,2 +503,7 @@ return this.recreateFromSeries([newColumn].concat(this.columns()));

}
/**
* Resamples the timeframe by the specified time interval. Each row
* of the result TimeFrame will be the result of the selected aggregation.
* @param options
*/
resample(options) {

@@ -462,10 +513,9 @@ var _a, _b;

if (!from) {
throw new Error('Cannot infer a lower bound for resample');
throw new Error("Cannot infer a lower bound for resample");
}
const to = options.to || ((_b = this.last()) === null || _b === void 0 ? void 0 : _b.time);
if (!to) {
throw new Error('Cannot infer an upper bound for resample');
throw new Error("Cannot infer an upper bound for resample");
}
return TimeFrame.concat(this.partition(options)
.map((chunk) => chunk.reduce(options)));
return TimeFrame.concat(this.partition(options).map((chunk) => chunk.reduce(options)));
}

@@ -478,11 +528,17 @@ /**

filter(fn) {
return new TimeFrame({ data: this.rows().filter(fn), metadata: this.metadata });
return new TimeFrame({
data: this.rows().filter(fn),
metadata: this.metadata,
});
}
/**
* Returns a new timeframe where each **row** is mapped by the iterator function. For mapping over columns, use apply()
* @param fn Iterator function
* @returns {TimeFrame}
*/
* Returns a new timeframe where each **row** is mapped by the iterator function. For mapping over columns, use apply()
* @param fn Iterator function
* @returns {TimeFrame}
*/
map(fn) {
return new TimeFrame({ data: this.rows().map(fn), metadata: this.metadata });
return new TimeFrame({
data: this.rows().map(fn),
metadata: this.metadata,
});
}

@@ -496,5 +552,7 @@ /**

apply(fn, columns = this.columnNames) {
const unmodifiedColumns = this.columnNames.filter((columnName) => !columns.includes(columnName)).map((columnName) => this.column(columnName));
const unmodifiedColumns = this.columnNames
.filter((columnName) => !columns.includes(columnName))
.map((columnName) => this.column(columnName));
const series = columns
.map((columnName) => (this.column(columnName)))
.map((columnName) => this.column(columnName))
.map(fn);

@@ -506,3 +564,2 @@ return TimeFrame.fromTimeseries(unmodifiedColumns.concat(series));

* @param options
* @returns
*/

@@ -513,11 +570,14 @@ partition(options) {

if (!from) {
throw new Error('Cannot infer a lower bound for resample');
throw new Error("Cannot infer a lower bound for resample");
}
const to = options.to || ((_b = this.last()) === null || _b === void 0 ? void 0 : _b.time);
if (!to) {
throw new Error('Cannot infer an upper bound for resample');
throw new Error("Cannot infer an upper bound for resample");
}
const intervals = types_1.TimeInterval.generate(from, to, options.interval);
const partitions = intervals.map((interval) => {
return this.betweenTime(interval.from, interval.to, { includeInferior: true, includeSuperior: false });
return this.betweenTime(interval.from, interval.to, {
includeInferior: true,
includeSuperior: false,
});
});

@@ -537,2 +597,9 @@ return partitions.map((p, idx) => {

/**
* Splits a timeframe into multiple timeframes where each timeframe has
* a maximum of `options.chunks` rows.
*/
split(options) {
return utils_1.chunk(this.rows(), options.chunks).map((rows) => this.recreate(rows));
}
/**
* Runs a series of transformations defined as an object. Useful in automation.

@@ -556,2 +623,2 @@ * A stage is an object with a single key and a value, the key is the name of the method, the value is the params object

exports.TimeFrame = TimeFrame;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWZyYW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90aW1lZnJhbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQXVDO0FBQ3ZDLG1DQUFtVztBQUNuVyxtQ0FBNkM7QUFDN0MsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLEVBQUU7SUFDekQsSUFBSSxlQUFlLElBQUksZUFBZSxFQUFFO1FBQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0tBQ3hCO1NBQU0sSUFBSSxlQUFlLElBQUksQ0FBQyxlQUFlLEVBQUU7UUFDOUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7S0FDdkI7U0FBTSxJQUFJLENBQUMsZUFBZSxJQUFJLGVBQWUsRUFBRTtRQUM5QyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtLQUN2QjtTQUFNO1FBQ0wsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7S0FDdEI7QUFDSCxDQUFDLENBQUE7QUFNRDs7O0dBR0c7QUFDSCxNQUFhLFNBQVM7SUFNcEI7Ozs7T0FJRztJQUNILFlBQWEsT0FBeUI7UUFWckIsU0FBSSxHQUFzQixFQUFFLENBQUE7UUFDN0MsZ0JBQVcsR0FBYSxFQUFFLENBQUE7UUFDMUIsYUFBUSxHQUFhLEVBQUUsQ0FBQTtRQVNyQixNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsR0FBRyxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUE7UUFDdkMsMkRBQTJEO1FBQzNELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO1FBRXhCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDckIsSUFBSSxDQUFDLElBQUksR0FB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
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWZyYW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90aW1lZnJhbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsMkNBQXdDO0FBQ3hDLG1DQXNCaUI7QUFDakIsbUNBQWtEO0FBQ2xELE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxFQUFFO0lBQ3pELElBQUksZUFBZSxJQUFJLGVBQWUsRUFBRTtRQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUN6QjtTQUFNLElBQUksZUFBZSxJQUFJLENBQUMsZUFBZSxFQUFFO1FBQzlDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ3hCO1NBQU0sSUFBSSxDQUFDLGVBQWUsSUFBSSxlQUFlLEVBQUU7UUFDOUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDeEI7U0FBTTtRQUNMLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ3ZCO0FBQ0gsQ0FBQyxDQUFDO0FBT0YsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUM7QUFNdEQ7OztHQUdHO0FBQ0gsTUFBYSxTQUFTO0lBT3BCOzs7O09BSUc7SUFDSCxZQUFZLE9BQXlCO1FBWHBCLFNBQUksR0FBc0IsRUFBRSxDQUFDO1FBQzlDLGdCQUFXLEdBQWEsRUFBRSxDQUFDO1FBQzNCLGFBQVEsR0FBYSxFQUFFLENBQUM7UUFFaEIsYUFBUSxHQUE4QixFQUFFLENBQUM7UUFRL0MsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEdBQUcsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQ3hDLDJEQUEyRDtRQUMzRCxJQUFJLENBQUMsUUFBUSxHQUFH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QUFFO1lBQ2QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckMsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQ0QsRUFBRSxJQUFJLEVBQUUsQ0FDVCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsR0FBRztRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRTtZQUN2QixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQztRQUMvQixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQzFCLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ2QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQ0QsRUFBRSxJQUFJLEVBQUUsQ0FDVCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsR0FBRztRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRTtZQUN2QixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQztRQUMvQixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQzFCLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ2QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQ0QsRUFBRSxJQUFJLEVBQUUsQ0FDVCxDQUFDO0lBQ0os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

@@ -9,19 +9,20 @@ "use strict";

const timeserie_1 = require("./timeserie");
ava_1.default('TimeFrame.column() should return the correct timeserie', (t) => {
const utils_1 = require("./utils");
ava_1.default("TimeFrame.column() should return the correct timeserie", (t) => {
const data = [
{ time: '2021-01-01', energy: 1, power: 4 },
{ time: '2021-01-02', energy: 2, power: 8 }
{ time: "2021-01-01", energy: 1, power: 4 },
{ time: "2021-01-02", energy: 2, power: 8 },
];
const tf = new timeframe_1.TimeFrame({ data });
const energy = tf.column('energy');
const energy = tf.column("energy");
t.is(true, energy instanceof timeserie_1.TimeSerie);
t.is(2, energy.length());
t.is(energy.atTime('2021-01-01'), 1);
t.is(energy.atTime('2021-01-02'), 2);
t.is(energy.atTime("2021-01-01"), 1);
t.is(energy.atTime("2021-01-02"), 2);
});
ava_1.default('TimeFrame.length() should return the correct value', (t) => {
ava_1.default("TimeFrame.length() should return the correct value", (t) => {
const data = [
{ time: '2021-01-01', energy: 1, power: 4 },
{ time: '2021-01-01', energy: 1, power: 5 },
{ time: '2021-01-02', energy: 2, power: 8 }
{ time: "2021-01-01", energy: 1, power: 4 },
{ time: "2021-01-01", energy: 1, power: 5 },
{ time: "2021-01-02", energy: 2, power: 8 },
];

@@ -31,7 +32,7 @@ const tf = new timeframe_1.TimeFrame({ data });

});
ava_1.default('TimeFrame.shape() should return the correct value', (t) => {
ava_1.default("TimeFrame.shape() should return the correct value", (t) => {
const data = [
{ time: '2021-01-01', energy: 1, power: 4 },
{ time: '2021-01-02', energy: 1, power: 5 },
{ time: '2021-01-03', energy: 2, power: 8 }
{ time: "2021-01-01", energy: 1, power: 4 },
{ time: "2021-01-02", energy: 1, power: 5 },
{ time: "2021-01-03", energy: 2, power: 8 },
];

@@ -41,25 +42,29 @@ const tf = new timeframe_1.TimeFrame({ data });

});
ava_1.default('TimeFrame.indexes() should return the correct value', (t) => {
ava_1.default("TimeFrame.indexes() should return the correct value", (t) => {
const data = [
{ time: '2021-01-03', energy: 1, power: 4 },
{ time: '2021-01-01', energy: 1, power: 5 },
{ time: '2021-01-02', energy: 2, power: 8 }
{ time: "2021-01-03", energy: 1, power: 4 },
{ time: "2021-01-01", energy: 1, power: 5 },
{ time: "2021-01-02", energy: 2, power: 8 },
];
const tf = new timeframe_1.TimeFrame({ data });
t.deepEqual(tf.indexes(), ['2021-01-01', '2021-01-02', '2021-01-03']);
t.deepEqual(tf.indexes(), [
utils_1.DateLikeToString("2021-01-01"),
utils_1.DateLikeToString("2021-01-02"),
utils_1.DateLikeToString("2021-01-03"),
]);
});
ava_1.default('TimeFrame.atTime() should return the correct row', (t) => {
ava_1.default("TimeFrame.atTime() should return the correct row", (t) => {
const data = [
{ time: '2021-01-01', energy: 1, power: 4 },
{ time: '2021-01-02', energy: 2, power: 8 }
{ time: "2021-01-01", energy: 1, power: 4 },
{ time: "2021-01-02", energy: 2, power: 8 },
];
const tf = new timeframe_1.TimeFrame({ data });
const row = tf.atTime('2021-01-02');
const row = tf.atTime("2021-01-02");
t.is(row.energy, 2);
t.is(row.power, 8);
});
ava_1.default('TimeFrame.toArray() should return an array of rows', (t) => {
ava_1.default("TimeFrame.toArray() should return an array of rows", (t) => {
const data = [
{ time: '2021-01-01', energy: 1, power: 4 },
{ time: '2021-01-02', energy: 2, power: 8 }
{ time: "2021-01-01T00:00:00.000Z", energy: 1, power: 4 },
{ time: "2021-01-02T00:00:00.000Z", energy: 2, power: 8 },
];

@@ -71,189 +76,252 @@ const tf = new timeframe_1.TimeFrame({ data });

});
ava_1.default('TimeFrame.fromTelemetryV1Output() should return the correct timeframe', (t) => {
ava_1.default("TimeFrame.fromTelemetryV1Output() should return the correct timeframe", (t) => {
const data = {
device1: {
energy: [['2021-01-01', 1], ['2021-01-02', 2]],
power: [['2021-01-01', 4], ['2021-01-02', 8]]
energy: [
["2021-01-01T00:00:00.000Z", 1],
["2021-01-02T00:00:00.000Z", 2],
],
power: [
["2021-01-01T00:00:00.000Z", 4],
["2021-01-02T00:00:00.000Z", 8],
],
},
device2: {
energy: [['2021-01-01', 1], ['2021-01-02', 2]],
power: [['2021-01-01', 4], ['2021-01-02', 8]]
}
energy: [
["2021-01-01T00:00:00.000Z", 1],
["2021-01-02T00:00:00.000Z", 2],
],
power: [
["2021-01-01T00:00:00.000Z", 4],
["2021-01-02T00:00:00.000Z", 8],
],
},
};
const tf = timeframe_1.TimeFrame.fromTelemetryV1Output(data);
const row = tf.atTime('2021-01-01');
t.is(row['device1:energy'], 1);
t.is(row['device1:power'], 4);
const d2energy = tf.column('device2:energy');
t.is(d2energy.metadata.deviceId, 'device2');
t.is(d2energy.metadata.propertyName, 'energy');
const row = tf.atTime("2021-01-01T00:00:00.000Z");
t.is(row["device1:energy"], 1);
t.is(row["device1:power"], 4);
const d2energy = tf.column("device2:energy");
t.is(d2energy.metadata.deviceId, "device2");
t.is(d2energy.metadata.propertyName, "energy");
});
ava_1.default('TimeFrame.fromTimeseries() should return the correct timeframe', (t) => {
ava_1.default("TimeFrame.fromTimeseries() should return the correct timeframe", (t) => {
var _a, _b, _c, _d;
const energyData = [
['2021-01-01T00:00:00.000Z', 4],
['2021-01-02T00:00:00.000Z', 4],
['2021-01-03T00:00:00.000Z', 4]
["2021-01-01T00:00:00.000Z", 4],
["2021-01-02T00:00:00.000Z", 4],
["2021-01-03T00:00:00.000Z", 4],
];
const powerData = [
['2021-01-01T00:00:00.000Z', 16],
['2021-01-02T00:00:00.000Z', 16],
['2021-01-03T00:00:00.000Z', 16]
["2021-01-01T00:00:00.000Z", 16],
["2021-01-02T00:00:00.000Z", 16],
["2021-01-03T00:00:00.000Z", 16],
];
const energyTS = new timeserie_1.TimeSerie('energy', energyData, { deviceId: 'd1' });
const powerTS = new timeserie_1.TimeSerie('power', powerData, { deviceId: 'd2' });
const energyTS = new timeserie_1.TimeSerie("energy", energyData, { deviceId: "d1" });
const powerTS = new timeserie_1.TimeSerie("power", powerData, { deviceId: "d2" });
const tf = timeframe_1.TimeFrame.fromTimeseries([energyTS, powerTS]);
const row = tf.atTime('2021-01-01T00:00:00.000Z');
const row = tf.atTime("2021-01-01T00:00:00.000Z");
t.is(row.energy, 4);
t.is(row.power, 16);
// We ensure that metadata is propagated to each timeserie
t.is((_b = (_a = tf.metadata) === null || _a === void 0 ? void 0 : _a.energy) === null || _b === void 0 ? void 0 : _b.deviceId, 'd1');
t.is((_d = (_c = tf.metadata) === null || _c === void 0 ? void 0 : _c.power) === null || _d === void 0 ? void 0 : _d.deviceId, 'd2');
t.is((_b = (_a = tf.metadata) === null || _a === void 0 ? void 0 : _a.energy) === null || _b === void 0 ? void 0 : _b.deviceId, "d1");
t.is((_d = (_c = tf.metadata) === null || _c === void 0 ? void 0 : _c.power) === null || _d === void 0 ? void 0 : _d.deviceId, "d2");
});
ava_1.default('TimeFrame.filter() should return the correct timeframe', (t) => {
ava_1.default("TimeFrame.filter() should return the correct timeframe", (t) => {
const data = [
{ time: '2021-01-01', energy: 1, power: 4 },
{ time: '2021-01-01', energy: 1, power: 5 },
{ time: '2021-01-02', energy: 2, power: 8 }
{ time: "2021-01-01", energy: 1, power: 4 },
{ time: "2021-01-01", energy: 1, power: 5 },
{ time: "2021-01-02", energy: 2, power: 8 },
];
const tf = new timeframe_1.TimeFrame({ data });
const filtered = tf.filter(row => { return row.power > 4; });
const filtered = tf.filter((row) => {
return row.power > 4;
});
t.is(filtered.length(), 2);
});
ava_1.default('TimeFrame.join() should return the correct timeframe', (t) => {
const data1 = [
{ time: '2021-01-01', energy: 1, power: 4 }
ava_1.default("TimeFrame.join() should return the correct timeframe", (t) => {
const data1 = [{ time: "2021-01-01", energy: 1, power: 4, voltage1: 7 }];
const data2 = [
{ time: "2021-01-02", energy: 1, power: 5, voltage2: 4 },
{ time: "2021-01-03", energy: 2, power: 8, voltage3: 5 },
];
const data3 = [
{ time: "2021-01-01", cosphi: 1 },
{ time: "2021-01-04", energy: 2, power: 2, cosphi: 1 },
];
const tf1 = new timeframe_1.TimeFrame({ data: data1 });
const tf2 = new timeframe_1.TimeFrame({ data: data2 });
const tf3 = new timeframe_1.TimeFrame({ data: data3 });
// We want join to be not be dependant to the ordering of timeframes
const joined1 = tf1.join([tf2, tf3]);
const joined2 = tf2.join([tf1, tf3]);
const joined3 = tf3.join([tf1, tf2]);
[joined1, joined2, joined3].forEach((joined) => {
t.is(joined.length(), 4);
t.is(joined.atTime("2021-01-01T00:00:00.000Z").energy, 1);
t.is(joined.atTime("2021-01-01T00:00:00.000Z").power, 4);
t.is(joined.atTime("2021-01-01T00:00:00.000Z").voltage1, 7);
t.is(joined.atTime("2021-01-01T00:00:00.000Z").voltage2, undefined);
t.is(joined.atTime("2021-01-01T00:00:00.000Z").voltage3, undefined);
t.is(joined.atTime("2021-01-02T00:00:00.000Z").energy, 1);
t.is(joined.atTime("2021-01-02T00:00:00.000Z").power, 5);
t.is(joined.atTime("2021-01-02T00:00:00.000Z").voltage1, undefined);
t.is(joined.atTime("2021-01-02T00:00:00.000Z").voltage2, 4);
t.is(joined.atTime("2021-01-02T00:00:00.000Z").voltage3, undefined);
});
});
ava_1.default("TimeFrame.merge() should return the correct timeframe", (t) => {
const data1 = [{ time: "2021-01-01", energy: 1, power: 4, voltage1: 7 }];
const data2 = [
{ time: '2021-01-02', energy: 1, power: 5 },
{ time: '2021-01-03', energy: 2, power: 8 }
{ time: "2021-01-02", energy: 1, power: 5, voltage2: 4 },
{ time: "2021-01-03", energy: 2, power: 8, voltage3: 5 },
];
const data3 = [
{ time: "2021-01-01", cosphi: 1, energy: 41 },
{ time: "2021-01-02", power: 11 },
{ time: "2021-01-04", energy: 2, power: 2, cosphi: 1 },
];
const tf1 = new timeframe_1.TimeFrame({ data: data1 });
const tf2 = new timeframe_1.TimeFrame({ data: data2 });
const joined = tf1.join([tf2]);
t.is(joined.length(), 3);
const tf3 = new timeframe_1.TimeFrame({ data: data3 });
// We want join to be not be dependant to the ordering of timeframes
const merged = timeframe_1.TimeFrame.merge([tf3, tf2, tf1]);
t.is(merged.length(), 4);
t.is(merged.atTime("2021-01-01T00:00:00.000Z").energy, 41);
t.is(merged.atTime("2021-01-01T00:00:00.000Z").cosphi, 1);
t.is(merged.atTime("2021-01-01T00:00:00.000Z").power, 4);
t.is(merged.atTime("2021-01-01T00:00:00.000Z").voltage1, 7);
t.is(merged.atTime("2021-01-02T00:00:00.000Z").energy, 1);
t.is(merged.atTime("2021-01-02T00:00:00.000Z").power, 11);
t.is(merged.atTime("2021-01-02T00:00:00.000Z").voltage2, 4);
t.is(merged.atTime("2021-01-03T00:00:00.000Z").energy, 2);
t.is(merged.atTime("2021-01-03T00:00:00.000Z").power, 8);
t.is(merged.atTime("2021-01-03T00:00:00.000Z").voltage3, 5);
});
ava_1.default('TimeFrame.apply() should correctly modify columns', (t) => {
ava_1.default("TimeFrame.apply() should correctly modify columns", (t) => {
const energyData = [
['2021-01-01T00:00:00.000Z', 4],
['2021-01-02T00:00:00.000Z', 4],
['2021-01-03T00:00:00.000Z', 4]
["2021-01-01T00:00:00.000Z", 4],
["2021-01-02T00:00:00.000Z", 4],
["2021-01-03T00:00:00.000Z", 4],
];
const powerData = [
['2021-01-01T00:00:00.000Z', 16],
['2021-01-02T00:00:00.000Z', 16],
['2021-01-03T00:00:00.000Z', 16]
["2021-01-01T00:00:00.000Z", 16],
["2021-01-02T00:00:00.000Z", 16],
["2021-01-03T00:00:00.000Z", 16],
];
const energyTS = new timeserie_1.TimeSerie('energy', energyData, { deviceId: 'd1' });
const powerTS = new timeserie_1.TimeSerie('power', powerData, { deviceId: 'd2' });
const energyTS = new timeserie_1.TimeSerie("energy", energyData, { deviceId: "d1" });
const powerTS = new timeserie_1.TimeSerie("power", powerData, { deviceId: "d2" });
const tf = timeframe_1.TimeFrame.fromTimeseries([energyTS, powerTS]);
const tf2 = tf.apply(ts => ts.map((p) => [p[0], 0]), ['power']);
t.is(tf.column('energy').sum()[1], 12);
t.is(tf2.column('power').sum()[1], 0);
t.is(tf2.metadata.energy.deviceId, 'd1');
t.is(tf2.metadata.power.deviceId, 'd2');
const tf2 = tf.apply((ts) => ts.map((p) => [p[0], 0]), ["power"]);
t.is(tf.column("energy").sum()[1], 12);
t.is(tf2.column("power").sum()[1], 0);
t.is(tf2.metadata.energy.deviceId, "d1");
t.is(tf2.metadata.power.deviceId, "d2");
});
ava_1.default('TimeFrame.resample(sum) should correctly resample and aggregate data', t => {
ava_1.default("TimeFrame.resample(sum) should correctly resample and aggregate data", (t) => {
const data = [
{ time: '2021-01-01T00:00:00.000Z', energy: 1, power: 1 },
{ time: '2021-01-01T00:01:00.000Z', energy: 1, power: 1 },
{ time: '2021-01-01T00:59:00.000Z', energy: 1, power: 1 },
{ time: '2021-01-01T01:01:00.000Z', energy: 1, power: 1 },
{ time: '2021-01-01T01:59:00.000Z', energy: 1, power: 1 },
{ time: '2021-01-01T02:00:00.000Z', energy: 1, power: 1 },
{ time: '2021-01-01T02:01:00.000Z', energy: 1, power: 1 },
{ time: '2021-01-01T02:59:00.000Z', energy: 1, power: 1 },
{ time: '2021-01-01T03:01:00.000Z', energy: 1, power: 1 }
{ time: "2021-01-01T00:00:00.000Z", energy: 1, power: 1 },
{ time: "2021-01-01T00:01:00.000Z", energy: 1, power: 1 },
{ time: "2021-01-01T00:59:00.000Z", energy: 1, power: 1 },
{ time: "2021-01-01T01:01:00.000Z", energy: 1, power: 1 },
{ time: "2021-01-01T01:59:00.000Z", energy: 1, power: 1 },
{ time: "2021-01-01T02:00:00.000Z", energy: 1, power: 1 },
{ time: "2021-01-01T02:01:00.000Z", energy: 1, power: 1 },
{ time: "2021-01-01T02:59:00.000Z", energy: 1, power: 1 },
{ time: "2021-01-01T03:01:00.000Z", energy: 1, power: 1 },
];
const tf = new timeframe_1.TimeFrame({ data, metadata: { hello: 'world' } });
const tf = new timeframe_1.TimeFrame({ data, metadata: { hello: "world" } });
const resampled = tf.resample({
interval: 1000 * 60 * 60,
from: '2021-01-01T00:00:00.000Z',
to: '2021-01-01T04:00:00.000Z',
operation: 'sum'
from: "2021-01-01T00:00:00.000Z",
to: "2021-01-01T04:00:00.000Z",
operation: "sum",
});
t.is(resampled.length(), 4);
t.is(resampled.rows()[0].time, '2021-01-01T00:00:00.000Z');
t.is(resampled.rows()[0].time, "2021-01-01T00:00:00.000Z");
t.is(resampled.rows()[0].power, 3);
t.is(resampled.rows()[0].energy, 3);
t.is(resampled.rows()[1].time, '2021-01-01T01:00:00.000Z');
t.is(resampled.rows()[1].time, "2021-01-01T01:00:00.000Z");
t.is(resampled.rows()[1].power, 2);
t.is(resampled.rows()[1].energy, 2);
t.is(resampled.rows()[2].time, '2021-01-01T02:00:00.000Z');
t.is(resampled.rows()[2].time, "2021-01-01T02:00:00.000Z");
t.is(resampled.rows()[2].power, 3);
t.is(resampled.rows()[2].energy, 3);
t.is(resampled.rows()[3].time, '2021-01-01T03:00:00.000Z');
t.is(resampled.rows()[3].time, "2021-01-01T03:00:00.000Z");
t.is(resampled.rows()[3].power, 1);
t.is(resampled.rows()[3].energy, 1);
t.is(resampled.metadata.hello, 'world');
t.is(resampled.metadata.hello, "world");
});
ava_1.default('TimeFrame.sum() should correctly sum all columns', t => {
ava_1.default("TimeFrame.sum() should correctly sum all columns", (t) => {
const data = [
{ time: '2021-01-01T00:00:00.000Z', energy: 1, power: 4 },
{ time: '2021-01-02T00:00:00.000Z', energy: 1, power: 3 },
{ time: '2021-01-03T00:00:00.000Z', energy: 2, power: 2 },
{ time: '2021-01-04T00:00:00.000Z', energy: 1, power: 9 }
{ time: "2021-01-01T00:00:00.000Z", energy: 1, power: 4 },
{ time: "2021-01-02T00:00:00.000Z", energy: 1, power: 3 },
{ time: "2021-01-03T00:00:00.000Z", energy: 2, power: 2 },
{ time: "2021-01-04T00:00:00.000Z", energy: 1, power: 9 },
];
const row = new timeframe_1.TimeFrame({ data }).sum();
t.is(row.time, '2021-01-01T00:00:00.000Z');
t.is(row.time, "2021-01-01T00:00:00.000Z");
t.is(row.energy, 5);
t.is(row.power, 18);
});
ava_1.default('TimeFrame.delta() should correctly delta all columns', t => {
ava_1.default("TimeFrame.delta() should correctly delta all columns", (t) => {
const data = [
{ time: '2021-01-01T00:00:00.000Z', energy: 1, expenergy: 4 },
{ time: '2021-01-02T00:00:00.000Z', energy: 2, expenergy: 8 },
{ time: '2021-01-03T00:00:00.000Z', energy: 3, expenergy: 12 },
{ time: '2021-01-04T00:00:00.000Z', energy: 4, expenergy: 16 }
{ time: "2021-01-01T00:00:00.000Z", energy: 1, expenergy: 4 },
{ time: "2021-01-02T00:00:00.000Z", energy: 2, expenergy: 8 },
{ time: "2021-01-03T00:00:00.000Z", energy: 3, expenergy: 12 },
{ time: "2021-01-04T00:00:00.000Z", energy: 4, expenergy: 16 },
];
const row = new timeframe_1.TimeFrame({ data }).delta();
t.is(row.time, '2021-01-01T00:00:00.000Z');
t.is(row.time, "2021-01-01T00:00:00.000Z");
t.is(row.energy, 3);
t.is(row.expenergy, 12);
});
ava_1.default('TimeFrame.max() should correctly max() all columns', t => {
ava_1.default("TimeFrame.max() should correctly max() all columns", (t) => {
const data = [
{ time: '2021-01-01T00:00:00.000Z', energy: 1, power: 4 },
{ time: '2021-01-02T00:00:00.000Z', energy: 7, power: 3 },
{ time: '2021-01-03T00:00:00.000Z', energy: 2, power: 2 },
{ time: '2021-01-04T00:00:00.000Z', energy: 1, power: 9 }
{ time: "2021-01-01T00:00:00.000Z", energy: 1, power: 4 },
{ time: "2021-01-02T00:00:00.000Z", energy: 7, power: 3 },
{ time: "2021-01-03T00:00:00.000Z", energy: 2, power: 2 },
{ time: "2021-01-04T00:00:00.000Z", energy: 1, power: 9 },
];
const row = new timeframe_1.TimeFrame({ data }).max();
t.is(row.time, '2021-01-01T00:00:00.000Z');
t.is(row.time, "2021-01-01T00:00:00.000Z");
t.is(row.energy, 7);
t.is(row.power, 9);
});
ava_1.default('TimeFrame.min() should correctly min() all columns', t => {
ava_1.default("TimeFrame.min() should correctly min() all columns", (t) => {
const data = [
{ time: '2021-01-01T00:00:00.000Z', energy: 3, power: 1 },
{ time: '2021-01-02T00:00:00.000Z', energy: 7, power: 3 },
{ time: '2021-01-03T00:00:00.000Z', energy: 2, power: 2 },
{ time: '2021-01-04T00:00:00.000Z', energy: 1, power: 9 }
{ time: "2021-01-01T00:00:00.000Z", energy: 3, power: 1 },
{ time: "2021-01-02T00:00:00.000Z", energy: 7, power: 3 },
{ time: "2021-01-03T00:00:00.000Z", energy: 2, power: 2 },
{ time: "2021-01-04T00:00:00.000Z", energy: 1, power: 9 },
];
const row = new timeframe_1.TimeFrame({ data }).min();
t.is(row.time, '2021-01-01T00:00:00.000Z');
t.is(row.time, "2021-01-01T00:00:00.000Z");
t.is(row.energy, 1);
t.is(row.power, 1);
});
ava_1.default('TimeFrame.avg() should correctly avg() all columns', t => {
ava_1.default("TimeFrame.avg() should correctly avg() all columns", (t) => {
const data = [
{ time: '2021-01-01T00:00:00.000Z', energy: 4, power: 1 },
{ time: '2021-01-02T00:00:00.000Z', energy: 4, power: 1 },
{ time: '2021-01-03T00:00:00.000Z', energy: 8, power: 11 },
{ time: '2021-01-04T00:00:00.000Z', energy: 8, power: 11 }
{ time: "2021-01-01T00:00:00.000Z", energy: 4, power: 1 },
{ time: "2021-01-02T00:00:00.000Z", energy: 4, power: 1 },
{ time: "2021-01-03T00:00:00.000Z", energy: 8, power: 11 },
{ time: "2021-01-04T00:00:00.000Z", energy: 8, power: 11 },
];
const row = new timeframe_1.TimeFrame({ data }).avg();
t.is(row.time, '2021-01-01T00:00:00.000Z');
t.is(row.time, "2021-01-01T00:00:00.000Z");
t.is(row.energy, 6);
t.is(row.power, 6);
});
ava_1.default('TimeFrame.aggregate() should correctly aggregate columns', t => {
ava_1.default("TimeFrame.aggregate() should correctly aggregate columns", (t) => {
const data = [
{ time: '2021-01-01T00:00:00.000Z', energy1: 1, energy2: 4 },
{ time: '2021-01-02T00:00:00.000Z', energy1: 2, energy2: 8 },
{ time: '2021-01-03T00:00:00.000Z', energy1: 3, energy2: 12 },
{ time: '2021-01-04T00:00:00.000Z', energy1: 4, energy2: 16 }
{ time: "2021-01-01T00:00:00.000Z", energy1: 1, energy2: 4 },
{ time: "2021-01-02T00:00:00.000Z", energy1: 2, energy2: 8 },
{ time: "2021-01-03T00:00:00.000Z", energy1: 3, energy2: 12 },
{ time: "2021-01-04T00:00:00.000Z", energy1: 4, energy2: 16 },
];
const agg = new timeframe_1.TimeFrame({ data, metadata: { hello: 'world' } })
.aggregate({ output: 'totalenergy', columns: ['energy1', 'energy2'], operation: 'add' });
const agg = new timeframe_1.TimeFrame({ data, metadata: { hello: "world" } }).aggregate({
output: "totalenergy",
columns: ["energy1", "energy2"],
operation: "add",
});
t.is(agg.atIndex(0).totalenergy, 5);

@@ -263,54 +331,57 @@ t.is(agg.atIndex(1).totalenergy, 10);

t.is(agg.atIndex(3).totalenergy, 20);
t.is(agg.metadata.hello, 'world');
t.is(agg.metadata.hello, "world");
});
ava_1.default('TimeFrame.project() should correctly aggregate columns', t => {
ava_1.default("TimeFrame.project() should correctly aggregate columns", (t) => {
const data = [
{ time: '2021-01-01T00:00:00.000Z', energy1: 1, energy2: 4 },
{ time: '2021-01-02T00:00:00.000Z', energy1: 2, energy2: 8 },
{ time: '2021-01-03T00:00:00.000Z', energy1: 3, energy2: 12 },
{ time: '2021-01-04T00:00:00.000Z', energy1: 4, energy2: 16 }
{ time: "2021-01-01T00:00:00.000Z", energy1: 1, energy2: 4 },
{ time: "2021-01-02T00:00:00.000Z", energy1: 2, energy2: 8 },
{ time: "2021-01-03T00:00:00.000Z", energy1: 3, energy2: 12 },
{ time: "2021-01-04T00:00:00.000Z", energy1: 4, energy2: 16 },
];
const tf = new timeframe_1.TimeFrame({ data, metadata: { hello: 'world' } });
const projected = tf.project({ columns: ['energy1'] });
const tf = new timeframe_1.TimeFrame({ data, metadata: { hello: "world" } });
const projected = tf.project({ columns: ["energy1"] });
t.is(tf.columns().length, 2);
t.is(projected.columns().length, 1);
t.is(projected.metadata.hello, 'world');
t.is(projected.metadata.hello, "world");
});
ava_1.default('TimeFrame.mul() should correctly multiply values', t => {
ava_1.default("TimeFrame.mul() should correctly multiply values", (t) => {
const data = [
{ time: '2021-01-01T00:00:00.000Z', energy1: 1, energy2: 4 },
{ time: '2021-01-02T00:00:00.000Z', energy1: 2, energy2: 8 },
{ time: '2021-01-03T00:00:00.000Z', energy1: 3, energy2: 12 },
{ time: '2021-01-04T00:00:00.000Z', energy1: 4, energy2: 16 }
{ time: "2021-01-01T00:00:00.000Z", energy1: 1, energy2: 4 },
{ time: "2021-01-02T00:00:00.000Z", energy1: 2, energy2: 8 },
{ time: "2021-01-03T00:00:00.000Z", energy1: 3, energy2: 12 },
{ time: "2021-01-04T00:00:00.000Z", energy1: 4, energy2: 16 },
];
const tf = new timeframe_1.TimeFrame({ data, metadata: { hello: 'world' } });
const tf = new timeframe_1.TimeFrame({ data, metadata: { hello: "world" } });
const multiplied = tf.mul(2);
t.is(multiplied.atTime('2021-01-01T00:00:00.000Z').energy1, 2);
t.is(multiplied.atTime('2021-01-01T00:00:00.000Z').energy2, 8);
t.is(multiplied.atTime('2021-01-02T00:00:00.000Z').energy1, 4);
t.is(multiplied.atTime('2021-01-02T00:00:00.000Z').energy2, 16);
t.is(multiplied.atTime("2021-01-01T00:00:00.000Z").energy1, 2);
t.is(multiplied.atTime("2021-01-01T00:00:00.000Z").energy2, 8);
t.is(multiplied.atTime("2021-01-02T00:00:00.000Z").energy1, 4);
t.is(multiplied.atTime("2021-01-02T00:00:00.000Z").energy2, 16);
});
ava_1.default('TimeFrame.add() should correctly add values', t => {
ava_1.default("TimeFrame.add() should correctly add values", (t) => {
const data = [
{ time: '2021-01-01T00:00:00.000Z', energy1: 1, energy2: 4 },
{ time: '2021-01-02T00:00:00.000Z', energy1: 2, energy2: 8 },
{ time: '2021-01-03T00:00:00.000Z', energy1: 3, energy2: 12 },
{ time: '2021-01-04T00:00:00.000Z', energy1: 4, energy2: 16 }
{ time: "2021-01-01T00:00:00.000Z", energy1: 1, energy2: 4 },
{ time: "2021-01-02T00:00:00.000Z", energy1: 2, energy2: 8 },
{ time: "2021-01-03T00:00:00.000Z", energy1: 3, energy2: 12 },
{ time: "2021-01-04T00:00:00.000Z", energy1: 4, energy2: 16 },
];
const tf = new timeframe_1.TimeFrame({ data, metadata: { hello: 'world' } });
const tf = new timeframe_1.TimeFrame({ data, metadata: { hello: "world" } });
const added = tf.add(2);
t.is(added.atTime('2021-01-01T00:00:00.000Z').energy1, 3);
t.is(added.atTime('2021-01-01T00:00:00.000Z').energy2, 6);
t.is(added.atTime('2021-01-02T00:00:00.000Z').energy1, 4);
t.is(added.atTime('2021-01-02T00:00:00.000Z').energy2, 10);
t.is(added.atTime("2021-01-01T00:00:00.000Z").energy1, 3);
t.is(added.atTime("2021-01-01T00:00:00.000Z").energy2, 6);
t.is(added.atTime("2021-01-02T00:00:00.000Z").energy1, 4);
t.is(added.atTime("2021-01-02T00:00:00.000Z").energy2, 10);
});
ava_1.default('TimeFrame.reduce() should correctly reduce the timeframe', t => {
ava_1.default("TimeFrame.reduce() should correctly reduce the timeframe", (t) => {
const data = [
{ time: '2021-01-01T00:00:00.000Z', energy: 1, power: 4 },
{ time: '2021-01-02T00:00:00.000Z', energy: 1, power: 4 },
{ time: '2021-01-03T00:00:00.000Z', energy: 1, power: 2 },
{ time: '2021-01-04T00:00:00.000Z', energy: 1, power: 2 }
{ time: "2021-01-01T00:00:00.000Z", energy: 1, power: 4 },
{ time: "2021-01-02T00:00:00.000Z", energy: 1, power: 4 },
{ time: "2021-01-03T00:00:00.000Z", energy: 1, power: 2 },
{ time: "2021-01-04T00:00:00.000Z", energy: 1, power: 2 },
];
const tf = new timeframe_1.TimeFrame({ data });
const reduced = tf.reduce({ operation: 'avg', operations: { energy: 'sum' } });
const reduced = tf.reduce({
operation: "avg",
operations: { energy: "sum" },
});
const rows = reduced.rows();

@@ -321,28 +392,223 @@ t.is(rows.length, 1);

});
ava_1.default('TimeFrame.pipeline() should correctly run all the stages', t => {
ava_1.default("TimeFrame.pipeline() should correctly run all the stages", (t) => {
const data = [
{ time: '2021-01-01T00:00:00.000Z', voltage1: 1, current1: 1, voltage2: 2, current2: 2, voltage3: 3, current3: 3 },
{ time: '2021-01-01T00:01:00.000Z', voltage1: 1, current1: 1, voltage2: 2, current2: 2, voltage3: 3, current3: 3 },
{ time: '2021-01-01T00:59:00.000Z', voltage1: 1, current1: 1, voltage2: 2, current2: 2, voltage3: 3, current3: 3 },
{ time: '2021-01-01T01:01:00.000Z', voltage1: 1, current1: 1, voltage2: 2, current2: 2, voltage3: 3, current3: 3 },
{ time: '2021-01-01T01:59:00.000Z', voltage1: 1, current1: 1, voltage2: 2, current2: 2, voltage3: 3, current3: 3 },
{ time: '2021-01-01T02:00:00.000Z', voltage1: 1, current1: 1, voltage2: 2, current2: 2, voltage3: 3, current3: 3 },
{ time: '2021-01-01T02:01:00.000Z', voltage1: 1, current1: 1, voltage2: 2, current2: 2, voltage3: 3, current3: 3 },
{ time: '2021-01-01T02:59:00.000Z', voltage1: 1, current1: 1, voltage2: 2, current2: 2, voltage3: 3, current3: 3 },
{ time: '2021-01-01T03:01:00.000Z', voltage1: 1, current1: 1, voltage2: 2, current2: 2, voltage3: 3, current3: 3 }
{
time: "2021-01-01T00:00:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T00:01:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T00:59:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T01:01:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T01:59:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T02:00:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T02:01:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T02:59:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T03:01:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
];
const tf = new timeframe_1.TimeFrame({ data, metadata: { hello: 'world' } });
const tf = new timeframe_1.TimeFrame({ data, metadata: { hello: "world" } });
const processed = tf.pipeline([
{ aggregate: { columns: ['voltage1', 'current1'], operation: 'mul', output: 'power1' } },
{ aggregate: { columns: ['voltage2', 'current2'], operation: 'mul', output: 'power2' } },
{ aggregate: { columns: ['voltage3', 'current3'], operation: 'mul', output: 'power3' } },
{ aggregate: { columns: ['power1', 'power2', 'power3'], operation: 'add', output: 'powertot' } },
{ project: { columns: ['powertot'] } },
{ resample: { interval: 1000 * 60 * 60, operation: 'avg', from: '2021-01-01T00:00:00.000Z' } }
{
aggregate: {
columns: ["voltage1", "current1"],
operation: "mul",
output: "power1",
},
},
{
aggregate: {
columns: ["voltage2", "current2"],
operation: "mul",
output: "power2",
},
},
{
aggregate: {
columns: ["voltage3", "current3"],
operation: "mul",
output: "power3",
},
},
{
aggregate: {
columns: ["power1", "power2", "power3"],
operation: "add",
output: "powertot",
},
},
{ project: { columns: ["powertot"] } },
{
resample: {
interval: 1000 * 60 * 60,
operation: "avg",
from: "2021-01-01T00:00:00.000Z",
},
},
]);
t.is(processed.length(), 4);
t.is(processed.columnNames.length, 1);
t.is(processed.columnNames[0], 'powertot');
t.is(processed.metadata.hello, 'world');
t.is(processed.columnNames[0], "powertot");
t.is(processed.metadata.hello, "world");
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWZyYW1lLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RpbWVmcmFtZS5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsOENBQXNCO0FBRXRCLDJDQUF1QztBQUN2QywyQ0FBdUM7QUFHdkMsYUFBSSxDQUFDLHdEQUF3RCxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDbkUsTUFBTSxJQUFJLEdBQUc7UUFDWCxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1FBQzNDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7S0FDNUMsQ0FBQTtJQUNELE1BQU0sRUFBRSxHQUFHLElBQUkscUJBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7SUFFbEMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUVsQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLFlBQVkscUJBQVMsQ0FBQyxDQUFBO0lBQ3ZDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFBO0lBQ3hCLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUNwQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFDdEMsQ0FBQyxDQUFDLENBQUE7QUFFRixhQUFJLENBQUMsb0RBQW9ELEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUMvRCxNQUFNLElBQUksR0FBRztRQUNYLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7UUFDM0MsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtRQUMzQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO0tBQzVDLENBQUE7SUFDRCxNQUFNLEVBQUUsR0FBRyxJQUFJLHFCQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBRWxDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBQ3RCLENBQUMsQ0FBQyxDQUFBO0FBQ0YsYUFBSSxDQUFDLG1EQUFtRCxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDOUQsTUFBTSxJQUFJLEdBQUc7UUFDWCxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1FBQzNDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7UUFDM0MsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtLQUM1QyxDQUFBO0lBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxxQkFBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUNsQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ2pDLENBQUMsQ0FBQyxDQUFBO0FBRUYsYUFBSSxDQUFDLHFEQUFxRCxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDaEUsTUFBTSxJQUFJLEdBQUc7UUFDWCxFQUFFLElBQUksRUFBRSxZQUFZ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RyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsT0FBTyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRTNELENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBQzVCLENBQUMsQ0FBQyxDQUFBO0FBRUYsYUFBSSxDQUFDLHNEQUFzRCxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDakUsTUFBTSxLQUFLLEdBQUc7UUFDWixFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO0tBQzVDLENBQUE7SUFDRCxNQUFNLEtBQUssR0FBRztRQUNaLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7UUFDM0MsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtLQUM1QyxDQUFBO0lBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxxQkFBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7SUFDMUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxxQkFBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7SUFFMUMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFFOUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFDMUIsQ0FBQyxDQUFDLENBQUE7QUFFRixhQUFJLENBQUMsbURBQW1ELEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUM5RCxNQUFNLFVBQVUsR0FBWTtRQUMxQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztLQUNoQyxDQUFBO0lBQ0QsTUFBTSxTQUFTLEdBQVk7UUFDekIsQ0FBQywwQkFBMEIsRUFBRSxFQUFFLENBQUM7UUFDaEMsQ0FBQywwQkFBMEIsRUFBRSxFQUFFLENBQUM7UUFDaEMsQ0FBQywwQkFBMEIsRUFBRSxFQUFFLENBQUM7S0FDakMsQ0FBQTtJQUNELE1BQU0sUUFBUSxHQUFHLElBQUkscUJBQVMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7SUFDeEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxxQkFBUyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUVyRSxNQUFNLEVBQUUsR0FBRyxxQkFBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO0lBRXhELE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtJQUV0RSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDdEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBRXJDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3hDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO0FBQ3pDLENBQUMsQ0FBQyxDQUFBO0FBRUYsYUFBSSxDQUFDLHNFQUFzRSxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQy9FLE1BQU0sSUFBSSxHQUFHO1FBQ1gsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1FBQ3pELEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtRQUN6RCxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7UUFDekQsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1FBQ3pELEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtRQUN6RCxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7UUFDekQsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1FBQ3pELEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtRQUN6RCxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7S0FDMUQsQ0FBQTtJQUNELE1BQU0sRUFBRSxHQUFHLElBQUks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MEJBQTBCLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO0tBQzFELENBQUE7SUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLHFCQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFBO0lBRXpDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSwwQkFBMEIsQ0FBQyxDQUFBO0lBQzFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUNuQixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7QUFDckIsQ0FBQyxDQUFDLENBQUE7QUFFRixhQUFJLENBQUMsc0RBQXNELEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDL0QsTUFBTSxJQUFJLEdBQUc7UUFDWCxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUU7UUFDN0QsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFO1FBQzdELEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtRQUM5RCxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7S0FDL0QsQ0FBQTtJQUNELE1BQU0sR0FBRyxHQUFHLElBQUkscUJBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUE7SUFFM0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLDBCQUEwQixDQUFDLENBQUE7SUFDMUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMs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QyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3ZCLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUN4QixDQUFDLENBQUMsQ0FBQTtBQUVGLGFBQUksQ0FBQywwREFBMEQsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUNuRSxNQUFNLElBQUksR0FBRztRQUNYLEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFO1FBQ2xILEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFO1FBQ2xILEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFO1FBQ2xILEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFO1FBQ2xILEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFO1FBQ2xILEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFO1FBQ2xILEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFO1FBQ2xILEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFO1FBQ2xILEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFO0tBQ25ILENBQUE7SUFDRCxNQUFNLEVBQUUsR0FBRyxJQUFJLHFCQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUVoRSxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQzVCLEVBQUUsU0FBUyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFO1FBQ3hGLEVBQUUsU0FBUyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFO1FBQ3hGLEVBQUUsU0FBUyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFO1FBQ3hGLEVBQUUsU0FBUyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsRUFBRTtRQUNoRyxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUU7UUFDdEMsRUFBRSxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsRUFBRTtLQUMvRixDQUFDLENBQUE7SUFFRixDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUMzQixDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3JDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQTtJQUUxQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0FBQ3pDLENBQUMsQ0FBQyxDQUFBIn0=
ava_1.default("TimeFrame.split() should split a timeframe into sub timeframes of fixed size", (t) => {
const data = [
{
time: "2021-01-01T00:00:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T00:01:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T00:59:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T01:01:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T01:59:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T02:00:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T02:01:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T02:59:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T03:01:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
];
const tf = new timeframe_1.TimeFrame({ data, metadata: { hello: "world" } });
const chunks = tf.split({ chunks: 3 });
t.is(chunks.length, 3);
t.deepEqual(chunks.map((tf) => tf.shape()), [
[3, 6],
[3, 6],
[3, 6],
]);
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWZyYW1lLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RpbWVmcmFtZS5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsOENBQXVCO0FBRXZCLDJDQUF3QztBQUN4QywyQ0FBd0M7QUFFeEMsbUNBQTJDO0FBRTNDLGFBQUksQ0FBQyx3REFBd0QsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQ25FLE1BQU0sSUFBSSxHQUFHO1FBQ1gsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtRQUMzQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO0tBQzVDLENBQUM7SUFDRixNQUFNLEVBQUUsR0FBRyxJQUFJLHFCQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRW5DLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFbkMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxZQUFZLHFCQUFTLENBQUMsQ0FBQztJQUN4QyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN6QixDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLENBQUMsQ0FBQyxDQUFDO0FBRUgsYUFBSSxDQUFDLG9EQUFvRCxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDL0QsTUFBTSxJQUFJLEdBQUc7UUFDWCxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1FBQzNDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7UUFDM0MsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtLQUM1QyxDQUFDO0lBQ0YsTUFBTSxFQUFFLEdBQUcsSUFBSSxxQkFBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUVuQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN2QixDQUFDLENBQUMsQ0FBQztBQUNILGFBQUksQ0FBQyxtREFBbUQsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQzlELE1BQU0sSUFBSSxHQUFHO1FBQ1gsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtRQUMzQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1FBQzNDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7S0FDNUMsQ0FBQztJQUNGLE1BQU0sRUFBRSxHQUFHLElBQUkscUJBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbkMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQyxDQUFDLENBQUMsQ0FBQztBQUVILGFBQUksQ0FBQyxxREFBcUQsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQ2hFLE1BQU0sSUFBSSxHQUFHO1FBQ1gsRUFBRSxJ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QyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFNUQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMxRCxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFNUQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDOUQsQ0FBQyxDQUFDLENBQUM7QUFFSCxhQUFJLENBQUMsbURBQW1ELEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUM5RCxNQUFNLFVBQVUsR0FBWTtRQUMxQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztLQUNoQyxDQUFDO0lBQ0YsTUFBTSxTQUFTLEdBQVk7UUFDekIsQ0FBQywwQkFBMEIsRUFBRSxFQUFFLENBQUM7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LFFBQVEsRUFBRSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUU7UUFDeEIsSUFBSSxFQUFFLDBCQUEwQjtRQUNoQyxFQUFFLEVBQUUsMEJBQTBCO1FBQzlCLFNBQVMsRUFBRSxLQUFLO0tBQ2pCLENBQUMsQ0FBQztJQUVILENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVCLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO0lBQzNELENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLDBCQUEwQixDQUFDLENBQUM7SUFDM0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztJQUMzRCxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVB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RUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekIsQ0FBQyxDQUFDLENBQUM7QUFFSCxhQUFJLENBQUMsMERBQTBELEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUNyRSxNQUFNLElBQUksR0FBRztRQUNYO1lBQ0UsSUFBSSxFQUFFLDBCQUEwQjtZQUNoQyxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7U0FDWjtRQUNEO1lBQ0UsSUFBSSxFQUFFLDBCQUEwQjtZQUNoQyxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7U0FDWjtRQUNEO1lBQ0UsSUFBSSxFQUFFLDBCQUEwQjtZQUNoQyxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7U0FDWjtRQUNEO1lBQ0UsSUFBSSxFQUFFLDBCQUEwQjtZQUNoQyxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7U0FDWjtRQUNEO1lBQ0UsSUFBSSxFQUFFLDBCQUEwQjtZQUNoQyxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7U0FDWjtRQUNEO1lBQ0UsSUFBSSxFQUFFLDBCQUEwQjtZQUNoQyxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7U0FDWjtRQUNEO1lBQ0UsSUFBSSxFQUFFLDBCQUEwQjtZQUNoQyxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7U0FDWjtRQUNEO1lBQ0UsSUFBSSxFQUFFLDBCQUEwQjtZQUNoQyxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7U0FDWjtRQUNEO1lBQ0UsSUFBSSxFQUFFLDBCQUEwQjtZQUNoQyxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7U0FDWjtLQUNGLENBQUM7SUFDRixNQUFNLEVBQUUsR0FBRyxJQUFJLHFCQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVqRSxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQzVCO1lBQ0UsU0FBUyxFQUFFO2dCQUNULE9BQU8sRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUM7Z0JBQ2pDLFNBQVMsRUFBRSxLQUFLO2dCQUNoQixNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO1FBQ0Q7WUFDRSxTQUFTLEVBQUU7Z0JBQ1QsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQztnQkFDakMsU0FBUyxFQUFFLEtBQUs7Z0JBQ2hCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRDtZQUNFLFNBQVMsRUFBRTtnQkFDVCxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDO2dCQUNqQyxTQUFTLEVBQUUsS0FBSztnQkFDaEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNEO1lBQ0UsU0FBUyxFQUFFO2dCQUNULE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDO2dCQUN2QyxTQUFTLEVBQUUsS0FBSztnQkFDaEIsTUFBTSxFQUFFLFVBQVU7YUFDbkI7U0FDRjtRQUNELEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRTtRQUN0QztZQUNFLFFBQVEsRUFBRTtnQkFDUixRQUFRLEVBQUUsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFO2dCQUN4QixTQUFTLEVBQUUsS0FBSztnQkFDaEIsSUFBSSxFQUFFLDBCQUEwQjthQUNqQztTQUNGO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0QyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFM0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMxQyxDQUFDLENBQUMsQ0FBQztBQUVILGFBQUksQ0FBQyw4RUFBOEUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQ3pGLE1BQU0sSUFBSSxHQUFHO1FBQ1g7WUFDRSxJQUFJLEVBQUUsMEJBQTBCO1lBQ2hDLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztTQUNaO1FBQ0Q7WUFDRSxJQUFJLEVBQUUsMEJBQTBCO1lBQ2hDLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztTQUNaO1FBQ0Q7WUFDRSxJQUFJLEVBQUUsMEJBQTBCO1lBQ2hDLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztTQUNaO1FBQ0Q7WUFDRSxJQUFJLEVBQUUsMEJBQTBCO1lBQ2hDLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztTQUNaO1FBQ0Q7WUFDRSxJQUFJLEVBQUUsMEJBQTBCO1lBQ2hDLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztTQUNaO1FBQ0Q7WUFDRSxJQUFJLEVBQUUsMEJBQTBCO1lBQ2hDLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztTQUNaO1FBQ0Q7WUFDRSxJQUFJLEVBQUUsMEJBQTBCO1lBQ2hDLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztTQUNaO1FBQ0Q7WUFDRSxJQUFJLEVBQUUsMEJBQTBCO1lBQ2hDLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztTQUNaO1FBQ0Q7WUFDRSxJQUFJLEVBQUUsMEJBQTBCO1lBQ2hDLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztTQUNaO0tBQ0YsQ0FBQztJQUVGLE1BQU0sRUFBRSxHQUFHLElBQUkscUJBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRWpFLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUV2QyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkIsQ0FBQyxDQUFDLFNBQVMsQ0FDVCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBYSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsRUFDekM7UUFDRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDTixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDTixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7S0FDUCxDQUNGLENBQUM7QUFDSixDQUFDLENBQUMsQ0FBQyJ9

@@ -1,2 +0,2 @@

import { DateLike, FromIndexOptions, Index, Metadata, PartitionOptions, Point, PointValue, ReindexOptions, ResampleOptions, TimeseriePointIterator, TimeSerieReduceOptions, TimeSeriesOperationOptions } from './types';
import { BetweenTimeOptions, DateLike, FromIndexOptions, Index, Metadata, PartitionOptions, Point, PointValue, ReindexOptions, ResampleOptions, SplitOptions, TimeseriePointIterator, TimeSerieReduceOptions, TimeSeriesOperationOptions } from "./types";
/**

@@ -14,6 +14,18 @@ * A data structure for a time serie.

};
/**
* Creates a new timeserie.
* @param name {String} The name of the serie
* @param serie {Point[]} The points in the serie
* @param metadata {Metadata} Optional metadata
*/
constructor(name: string, serie: Point[] | ReadonlyArray<Point>, metadata?: Metadata);
/**
* Creates a new TimeSerie from the given Index. The new serie's values are all set to `null` unless `options.fill` is passed.
* @param index
* @param options
*/
static fromIndex(index: Index, options: FromIndexOptions): TimeSerie;
/**
* Recreates the serie's index
* Recreates the serie's index according to `options` and returns the reindexed serie.
*
* @param index The new index to use. Can be created with createIndex()

@@ -27,5 +39,9 @@ * @see createIndex

*
* @returns Array of points, where each point is a tuple with ISO8601 timestamp and value
* Returns the array of points, where each point is a tuple with ISO8601 timestamp and value
*/
toArray(): Point[];
/**
* Updates (in place) the serie's name. **This method does NOT return a new timeserie**.
* @param name
*/
rename(name: string): this;

@@ -40,3 +56,3 @@ /**

*
* @returns The array of time indexes
* Returns the array of time indexes
*/

@@ -46,3 +62,3 @@ indexes(): DateLike[];

*
* @returns The array of values
* Returns the array of values
*/

@@ -56,3 +72,3 @@ values(): PointValue[];

*
* @returns The time of the latest non-NaN value
* Returns the time of the latest non-NaN value
*/

@@ -62,18 +78,16 @@ lastValidIndex(): string | null;

*
* @returns The time of the first non-NaN value
* Returns the time of the first non-NaN value
*/
firstValidIndex(): string | null;
/**
*
* @returns The latest non-NaN value
* Returns the latest non-NaN value
*/
lastValidValue(): PointValue;
/**
*
* @returns The first non-NaN value
* Returns the first non-NaN value
*/
firstValidValue(): PointValue;
/**
*
* @returns {PointValue} The value of the timeseries at the given time
* Returns the value of the timeseries at the given time
* @returns {PointValue}
*/

@@ -83,37 +97,56 @@ atTime(time: DateLike, fillValue?: number): PointValue;

*
* @returns The value at the given index (position, not time)
* Returns the value at the given index.
*/
atIndex(index: number): PointValue;
/**
* Returns the subset of points between the two dates. Extremes are included.
*
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
* @returns The subset of points between the two dates. Extremes are included.
*/
betweenTime(from: DateLike, to: DateLike, options?: {
includeInferior: boolean;
includeSuperior: boolean;
}): TimeSerie;
betweenTime(from: DateLike, to: DateLike, options?: BetweenTimeOptions): TimeSerie;
/**
*
* @param from start positional index
* @param to end positional index
* @returns The subset of points between the two indexes. Extremes are included.
*/
* Returns the subset of points between the two indexes. Extremes are included.
*
* @param from start positional index
* @param to end positional index
*/
betweenIndexes(from: number, to: number): TimeSerie;
/**
* Builds a new serie by applying a filter function the current serie's points
* @params fn {Function}
*/
filter(fn: TimeseriePointIterator): TimeSerie;
/**
* Builds a new serie by applying a map function the current serie's points
* @param fn {Function}
*/
map(fn: TimeseriePointIterator): TimeSerie;
/**
* Returns the number of points in the serie.
*/
length(): number;
/**
* Returns true if the serie has 0 points
*/
isEmpty(): boolean;
/**
* Copies the serie to a new serie
*/
copy(): TimeSerie;
/**
* Returns the sum of the values in the serie
*/
sum(): Point;
/**
*
* @returns The average of point values
* Returns the average of the values in the serie
*/
avg(): Point;
/**
* Returns the difference between the last and the first element by performing last value - first value.
*/
delta(): Point;
/**
* Returns the first point
*
* @returns The firstfirst point
*/

@@ -124,3 +157,2 @@ first(): Point;

* @param time
* @returns
*/

@@ -130,3 +162,3 @@ firstAt(time: DateLike): Point;

*
* @returns The last point
* Returns the last point
*/

@@ -136,3 +168,3 @@ last(): Point;

*
* @returns The point with max value, or null
* Returns the point with max value, or null
*/

@@ -142,3 +174,3 @@ max(): Point | null;

*
* @returns The point with min value or null
* Returns the point with min value or null
*/

@@ -153,24 +185,39 @@ min(): Point | null;

* @param options
* @returns
*/
partition(options: PartitionOptions): TimeSerie[];
/**
* Splits a timeserie into multiple timeseries where each timeserie has
* a maximum of `options.chunks` points.
*/
split(options: SplitOptions): TimeSerie[];
/**
* Resample the timeserie using a new time interval and a point aggregation function
* @param options
* @returns
*/
resample(options: ResampleOptions): TimeSerie;
/**
* Remove the point at the given time and returns a new serie
*/
removeAt(time: DateLike): TimeSerie;
/**
* Remove the point at the given index and returns a new serie
*/
removeAtIndex(index: number): TimeSerie;
/**
*
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
* @returns New timeserie without the removed data. Bounds are removed.
*/
* Returns the new timeserie without the removed data. Bounds are removed.
*
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
*/
removeBetweenTime(from: DateLike, to: DateLike): TimeSerie;
/**
* Removes points with NaN value from the serie
*/
dropNaN(): TimeSerie;
/**
* Removes points with null value from the serie.
*/
dropNull(): TimeSerie;
/**
*
* Rounds the serie's points.
* @param decimals {Number} the number of decimals to keep

@@ -180,7 +227,33 @@ * @returns {TimeSerie}

round(decimals: number): TimeSerie;
/**
* Combine the current serie with an array of series y performing combination operations, such as multiplication, addition ecc.
* @param operation {string}
* @param series {TimeSerie[]}
* @param options {TimeSeriesOperationOptions}
*/
combine(operation: string, series: TimeSerie[], options?: TimeSeriesOperationOptions): TimeSerie;
/**
* Adds values to the timeserie. If a scalar is passed, its value is added to every point in the serie. If another serie
* is passed, the two series are combined by addition.
* @see combine
*/
add(value: number | TimeSerie): TimeSerie;
/**
* Subtracts values from the timeserie. If a scalar is passed, its value is subtracted from every point in the serie. If another serie
* is passed, the two series are combined by subtraction.
* @see combine
*/
sub(value: number | TimeSerie): TimeSerie;
/**
* Multiplies values of the timeserie. If a scalar is passed, every point in the serie is multiplied times that value. If another serie
* is passed, the two series are combined by multiplication.
* @see combine
*/
mul(value: number | TimeSerie): TimeSerie;
/**
* Divides values of the timeserie. If a scalar is passed, every point in the serie is divided by that value. If another serie
* is passed, the two series are combined by division.
* @see combine
*/
div(value: number | TimeSerie): TimeSerie;
}
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });

@@ -6,12 +25,14 @@ exports.TimeSerie = void 0;

const utils_1 = require("./utils");
const Timsort = __importStar(require("timsort"));
function isNumeric(str) {
if (typeof str === 'number')
if (typeof str === "number")
return !isNaN(str);
if (typeof str !== 'string')
if (typeof str !== "string")
return false; // we only process strings!
return !isNaN(str) && // use type coercion to parse the _entirety_ of the string (`parseFloat` alone does not do this)...
!isNaN(parseFloat(str)); // ...and ensure strings of whitespace fail
return (!isNaN(str) && // use type coercion to parse the _entirety_ of the string (`parseFloat` alone does not do this)...
!isNaN(parseFloat(str))); // ...and ensure strings of whitespace fail
}
function sortPoints(points) {
return [].concat(points).sort((a, b) => {
const arr = [].concat(points);
Timsort.sort(arr, (a, b) => {
if (a[0] > b[0]) {

@@ -24,2 +45,3 @@ return 1;

});
return arr;
}

@@ -33,2 +55,8 @@ function normalizePoint(p) {

class TimeSerie {
/**
* Creates a new timeserie.
* @param name {String} The name of the serie
* @param serie {Point[]} The points in the serie
* @param metadata {Metadata} Optional metadata
*/
constructor(name, serie, metadata = {}) {

@@ -38,3 +66,5 @@ this.data = sortPoints(serie).map(normalizePoint);

this.metadata = metadata;
this.index = [].concat(this.data).reduce((acc, p) => {
this.index = []
.concat(this.data)
.reduce((acc, p) => {
acc[p[0]] = p;

@@ -44,7 +74,13 @@ return acc;

}
/**
* Creates a new TimeSerie from the given Index. The new serie's values are all set to `null` unless `options.fill` is passed.
* @param index
* @param options
*/
static fromIndex(index, options) {
return new TimeSerie(options.name, index.map((i) => ([i, (options === null || options === void 0 ? void 0 : options.fill) || null])), options.metadata);
return new TimeSerie(options.name, index.map((i) => [i, (options === null || options === void 0 ? void 0 : options.fill) || null]), options.metadata);
}
/**
* Recreates the serie's index
* Recreates the serie's index according to `options` and returns the reindexed serie.
*
* @param index The new index to use. Can be created with createIndex()

@@ -58,9 +94,9 @@ * @see createIndex

const idx = [...new Set(this.indexes().concat(index))];
return new TimeSerie(this.name, idx.map((i) => ([i, this.atTime(i) || (options === null || options === void 0 ? void 0 : options.fill) || null])), this.metadata);
return new TimeSerie(this.name, idx.map((i) => [i, this.atTime(i) || (options === null || options === void 0 ? void 0 : options.fill) || null]), this.metadata);
}
return new TimeSerie(this.name, index.map((i) => ([i, this.atTime(i) || (options === null || options === void 0 ? void 0 : options.fill) || null])), this.metadata);
return new TimeSerie(this.name, index.map((i) => [i, this.atTime(i) || (options === null || options === void 0 ? void 0 : options.fill) || null]), this.metadata);
}
/**
*
* @returns Array of points, where each point is a tuple with ISO8601 timestamp and value
* Returns the array of points, where each point is a tuple with ISO8601 timestamp and value
*/

@@ -70,2 +106,6 @@ toArray() {

}
/**
* Updates (in place) the serie's name. **This method does NOT return a new timeserie**.
* @param name
*/
rename(name) {

@@ -85,3 +125,3 @@ this.name = name;

*
* @returns The array of time indexes
* Returns the array of time indexes
*/

@@ -93,3 +133,3 @@ indexes() {

*
* @returns The array of values
* Returns the array of values
*/

@@ -103,10 +143,13 @@ values() {

static concat(series) {
return new TimeSerie(series[0].name, series.map(serie => serie.toArray()).flat(), Object.assign({}, ...series.map(serie => serie.metadata)));
return new TimeSerie(series[0].name, series.flatMap((serie) => serie.toArray()), Object.assign({}, ...series.map((serie) => serie.metadata)));
}
/**
*
* @returns The time of the latest non-NaN value
* Returns the time of the latest non-NaN value
*/
lastValidIndex() {
const result = this.data.concat([]).reverse().find((point) => {
const result = this.data
.concat([])
.reverse()
.find((point) => {
return !!point[1];

@@ -123,3 +166,3 @@ });

*
* @returns The time of the first non-NaN value
* Returns the time of the first non-NaN value
*/

@@ -138,7 +181,9 @@ firstValidIndex() {

/**
*
* @returns The latest non-NaN value
* Returns the latest non-NaN value
*/
lastValidValue() {
const result = this.data.concat([]).reverse().find((point) => {
const result = this.data
.concat([])
.reverse()
.find((point) => {
return !!point[1];

@@ -154,4 +199,3 @@ });

/**
*
* @returns The first non-NaN value
* Returns the first non-NaN value
*/

@@ -170,4 +214,4 @@ firstValidValue() {

/**
*
* @returns {PointValue} The value of the timeseries at the given time
* Returns the value of the timeseries at the given time
* @returns {PointValue}
*/

@@ -180,7 +224,7 @@ atTime(time, fillValue = null) {

*
* @returns The value at the given index (position, not time)
* Returns the value at the given index.
*/
atIndex(index) {
if (index >= this.data.length) {
throw new Error('Index out of bounds');
throw new Error("Index out of bounds");
}

@@ -190,8 +234,11 @@ return this.data[index][1];

/**
* Returns the subset of points between the two dates. Extremes are included.
*
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
* @returns The subset of points between the two dates. Extremes are included.
*/
betweenTime(from, to, options = { includeInferior: true, includeSuperior: true }) {
betweenTime(from, to, options = {
includeInferior: true,
includeSuperior: true,
}) {
const { includeInferior, includeSuperior } = options;

@@ -202,12 +249,16 @@ const f = new Date(from);

if (includeInferior && includeSuperior) {
return new Date(point[0]).getTime() >= f.getTime() && new Date(point[0]).getTime() <= t.getTime();
return (new Date(point[0]).getTime() >= f.getTime() &&
new Date(point[0]).getTime() <= t.getTime());
}
else if (includeInferior && !includeSuperior) {
return new Date(point[0]).getTime() >= f.getTime() && new Date(point[0]).getTime() < t.getTime();
return (new Date(point[0]).getTime() >= f.getTime() &&
new Date(point[0]).getTime() < t.getTime());
}
else if (!includeInferior && includeSuperior) {
return new Date(point[0]).getTime() > f.getTime() && new Date(point[0]).getTime() <= t.getTime();
return (new Date(point[0]).getTime() > f.getTime() &&
new Date(point[0]).getTime() <= t.getTime());
}
else {
return new Date(point[0]).getTime() > f.getTime() && new Date(point[0]).getTime() < t.getTime();
return (new Date(point[0]).getTime() > f.getTime() &&
new Date(point[0]).getTime() < t.getTime());
}

@@ -218,25 +269,47 @@ });

/**
*
* @param from start positional index
* @param to end positional index
* @returns The subset of points between the two indexes. Extremes are included.
*/
* Returns the subset of points between the two indexes. Extremes are included.
*
* @param from start positional index
* @param to end positional index
*/
betweenIndexes(from, to) {
return this.filter((_, i) => { return i >= from && i <= to; });
return this.filter((_, i) => {
return i >= from && i <= to;
});
}
/**
* Builds a new serie by applying a filter function the current serie's points
* @params fn {Function}
*/
filter(fn) {
return this.recreate(this.data.filter(fn));
}
/**
* Builds a new serie by applying a map function the current serie's points
* @param fn {Function}
*/
map(fn) {
return this.recreate(this.data.map(fn));
}
/**
* Returns the number of points in the serie.
*/
length() {
return this.data.length;
}
/**
* Returns true if the serie has 0 points
*/
isEmpty() {
return this.data.length === 0;
}
/**
* Copies the serie to a new serie
*/
copy() {
return new TimeSerie(this.name, this.data, this.metadata);
}
/**
* Returns the sum of the values in the serie
*/
sum() {

@@ -247,7 +320,12 @@ if (this.length() === 0) {

const copy = this.dropNaN();
return [this.first()[0], copy.data.map((p) => p[1]).reduce((p1, p2) => p1 + p2, 0)];
let tot = 0;
const l = copy.length();
const data = copy.toArray();
for (let i = l - 1; i >= 0; i--) {
tot += data[i][1];
}
return [this.first()[0], tot];
}
/**
*
* @returns The average of point values
* Returns the average of the values in the serie
*/

@@ -261,2 +339,5 @@ avg() {

}
/**
* Returns the difference between the last and the first element by performing last value - first value.
*/
delta() {

@@ -273,4 +354,4 @@ if (this.length() <= 0) {

/**
* Returns the first point
*
* @returns The firstfirst point
*/

@@ -283,10 +364,11 @@ first() {

* @param time
* @returns
*/
firstAt(time) {
return this.data.find((p) => { return new Date(p[0]).getTime() >= new Date(time).getTime(); });
return this.data.find((p) => {
return new Date(p[0]).getTime() >= new Date(time).getTime();
});
}
/**
*
* @returns The last point
* Returns the last point
*/

@@ -298,3 +380,3 @@ last() {

*
* @returns The point with max value, or null
* Returns the point with max value, or null
*/

@@ -308,7 +390,7 @@ max() {

}
return this.data.reduce((prev, current) => current[1] > prev[1] ? current : prev, this.data[0]);
return this.data.reduce((prev, current) => (current[1] > prev[1] ? current : prev), this.data[0]);
}
/**
*
* @returns The point with min value or null
* Returns the point with min value or null
*/

@@ -322,3 +404,3 @@ min() {

}
return this.data.reduce((prev, current) => current[1] < prev[1] ? current : prev, this.data[0]);
return this.data.reduce((prev, current) => (current[1] < prev[1] ? current : prev), this.data[0]);
}

@@ -334,3 +416,2 @@ /**

* @param options
* @returns
*/

@@ -341,11 +422,14 @@ partition(options) {

if (!from) {
throw new Error('Cannot infer a lower bound for resample');
throw new Error("Cannot infer a lower bound for resample");
}
const to = options.to || ((_b = this.last()) === null || _b === void 0 ? void 0 : _b[0]);
if (!to) {
throw new Error('Cannot infer an upper bound for resample');
throw new Error("Cannot infer an upper bound for resample");
}
const intervals = types_1.TimeInterval.generate(from, to, options.interval);
const partitions = intervals.map((interval) => {
return this.betweenTime(interval.from, interval.to, { includeInferior: true, includeSuperior: false });
return this.betweenTime(interval.from, interval.to, {
includeInferior: true,
includeSuperior: false,
});
});

@@ -366,5 +450,13 @@ return partitions.map((p, idx) => {

/**
* Splits a timeserie into multiple timeseries where each timeserie has
* a maximum of `options.chunks` points.
*/
split(options) {
return utils_1.chunk(this.toArray(), options.chunks).map((points) => {
return this.recreate(points);
});
}
/**
* Resample the timeserie using a new time interval and a point aggregation function
* @param options
* @returns
*/

@@ -374,23 +466,32 @@ resample(options) {

if (!from) {
throw new Error('Cannot infer a lower bound for resample');
throw new Error("Cannot infer a lower bound for resample");
}
const to = options.to || this.last()[0];
if (!to) {
throw new Error('Cannot infer an upper bound for resample');
throw new Error("Cannot infer an upper bound for resample");
}
return TimeSerie.concat(this.partition(options)
.map((chunk) => chunk.reduce(options)));
return TimeSerie.concat(this.partition(options).map((chunk) => chunk.reduce(options)));
}
/**
* Remove the point at the given time and returns a new serie
*/
removeAt(time) {
return this.recreate(this.data.filter((p) => { return p[0] !== utils_1.DateLikeToString(time); }));
return this.recreate(this.data.filter((p) => {
return p[0] !== utils_1.DateLikeToString(time);
}));
}
/**
* Remove the point at the given index and returns a new serie
*/
removeAtIndex(index) {
return this.recreate(this.data.filter((_, i) => { return i !== index; }));
return this.recreate(this.data.filter((_, i) => {
return i !== index;
}));
}
/**
*
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
* @returns New timeserie without the removed data. Bounds are removed.
*/
* Returns the new timeserie without the removed data. Bounds are removed.
*
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
*/
removeBetweenTime(from, to) {

@@ -400,9 +501,16 @@ const f = new Date(from);

const data = this.data.filter((point) => {
return new Date(point[0]).getTime() < f.getTime() || new Date(point[0]).getTime() > t.getTime();
return (new Date(point[0]).getTime() < f.getTime() ||
new Date(point[0]).getTime() > t.getTime());
});
return this.recreate(data);
}
/**
* Removes points with NaN value from the serie
*/
dropNaN() {
return this.filter((p) => isNumeric(p[1]));
}
/**
* Removes points with null value from the serie.
*/
dropNull() {

@@ -412,3 +520,3 @@ return this.filter((p) => p[1] !== null);

/**
*
* Rounds the serie's points.
* @param decimals {Number} the number of decimals to keep

@@ -418,5 +526,13 @@ * @returns {TimeSerie}

round(decimals) {
return this.map((p) => ([p[0], Number(Number(p[1]).toFixed(decimals))]));
return this.map((p) => [
p[0],
Number(Number(p[1]).toFixed(decimals)),
]);
}
// Operation between timeseries
/**
* Combine the current serie with an array of series y performing combination operations, such as multiplication, addition ecc.
* @param operation {string}
* @param series {TimeSerie[]}
* @param options {TimeSeriesOperationOptions}
*/
combine(operation, series, options = {}) {

@@ -427,32 +543,52 @@ options.name = options.name || this.name;

}
/**
* Adds values to the timeserie. If a scalar is passed, its value is added to every point in the serie. If another serie
* is passed, the two series are combined by addition.
* @see combine
*/
add(value) {
if (typeof value === 'number') {
if (typeof value === "number") {
return this.map((point) => [point[0], point[1] + value]);
}
else {
return this.combine('add', [value]);
return this.combine("add", [value]);
}
}
/**
* Subtracts values from the timeserie. If a scalar is passed, its value is subtracted from every point in the serie. If another serie
* is passed, the two series are combined by subtraction.
* @see combine
*/
sub(value) {
if (typeof value === 'number') {
if (typeof value === "number") {
return this.map((point) => [point[0], point[1] - value]);
}
else {
return this.combine('sub', [value]);
return this.combine("sub", [value]);
}
}
/**
* Multiplies values of the timeserie. If a scalar is passed, every point in the serie is multiplied times that value. If another serie
* is passed, the two series are combined by multiplication.
* @see combine
*/
mul(value) {
if (typeof value === 'number') {
if (typeof value === "number") {
return this.map((point) => [point[0], point[1] * value]);
}
else {
return this.combine('mul', [value]);
return this.combine("mul", [value]);
}
}
/**
* Divides values of the timeserie. If a scalar is passed, every point in the serie is divided by that value. If another serie
* is passed, the two series are combined by division.
* @see combine
*/
div(value) {
if (typeof value === 'number') {
if (typeof value === "number") {
return this.map((point) => [point[0], point[1] / value]);
}
else {
return this.combine('div', [value]);
return this.combine("div", [value]);
}

@@ -469,8 +605,7 @@ }

TimeSerie.internals.combine = (series, combiner, options) => {
const points = series[0].data.map((p) => p[0]).map((idx) => {
const points = series[0].data
.map((p) => p[0])
.map((idx) => {
const values = series.map((serie) => serie.atTime(idx, options.fill));
return [
idx,
combiner(values, idx)
];
return [idx, combiner(values, idx)];
});

@@ -483,4 +618,4 @@ return new TimeSerie(options.name, points, options.metadata);

TimeSerie.internals.combiners.div = (points) => points.reduce((a, b) => a / b, points[0] * points[0]);
TimeSerie.internals.combiners.avg = (points) => (TimeSerie.internals.combiners.add(points) / points.length);
TimeSerie.internals.combiners.avg = (points) => TimeSerie.internals.combiners.add(points) / points.length;
TimeSerie.createIndex = types_1.createIndex;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXNlcmllLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90aW1lc2VyaWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQTBRO0FBQzFRLG1DQUEwQztBQUUxQyxTQUFTLFNBQVMsQ0FBRSxHQUFvQjtJQUN0QyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7UUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQy9DLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFBLENBQUMsMkJBQTJCO0lBQ3JFLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBVSxDQUFDLElBQUksbUdBQW1HO1FBQzlILENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBLENBQUMsMkNBQTJDO0FBQ3ZFLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBRSxNQUFzQztJQUN6RCxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBUSxFQUFFLENBQVEsRUFBRSxFQUFFO1FBQ25ELElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNmLE9BQU8sQ0FBQyxDQUFBO1NBQ1Q7YUFBTTtZQUNMLE9BQU8sQ0FBQyxDQUFDLENBQUE7U0FDVjtJQUNILENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFFLENBQVE7SUFDL0IsT0FBTyxDQUFDLHdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ3ZDLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQWEsU0FBUztJQU9wQixZQUFhLElBQVksRUFBRSxLQUFxQyxFQUFFLFdBQXFCLEVBQUU7UUFDdkYsSUFBSSxDQUFD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QU0sS0FBSyxDQUFDLENBQUE7SUFDL0IsQ0FBQztJQUVELElBQUk7UUFDRixPQUFPLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDM0QsQ0FBQztJQUVELEdBQUc7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDdkIsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQTtTQUNwQjtRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDNUcsQ0FBQztJQUVEOzs7T0FHRztJQUNILEdBQUc7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDdkIsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQTtTQUNwQjtRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtJQUN6RCxDQUFDO0lBRUQsS0FBSztRQUNILElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtZQUN0QixPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFBO1NBQ3BCO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQzNCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRTtZQUN2QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7U0FDdkI7UUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM1RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSztRQUNILE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUE7SUFDN0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxPQUFPLENBQUUsSUFBYztRQUNyQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBUSxFQUFFLEVBQUUsR0FBRyxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDdEcsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUk7UUFDRixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQTtJQUM3QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsR0FBRztRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRTtZQUN2QixPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFBO1NBQ3BCO1FBQ0QsSUFBSSxJQUFJ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
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXNlcmllLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90aW1lc2VyaWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1DQWtCaUI7QUFDakIsbUNBQWtEO0FBRWxELGlEQUFtQztBQUVuQyxTQUFTLFNBQVMsQ0FBQyxHQUFvQjtJQUNyQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7UUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hELElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsMkJBQTJCO0lBQ3RFLE9BQU8sQ0FDTCxDQUFDLEtBQUssQ0FBQyxHQUFVLENBQUMsSUFBSSxtR0FBbUc7UUFDekgsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQ3hCLENBQUMsQ0FBQywyQ0FBMkM7QUFDaEQsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLE1BQXNDO0lBQ3hELE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUIsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFRLEVBQUUsQ0FBUSxFQUFFLEVBQUU7UUFDdkMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2YsT0FBTyxDQUFDLENBQUM7U0FDVjthQUFNO1lBQ0wsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUNYO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxDQUFRO0lBQzlCLE9BQU8sQ0FBQyx3QkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMs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R0FBRyxHQUFHLENBQUMsTUFBb0IsRUFBRSxFQUFFLENBQzNELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFhLEVBQUUsQ0FBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzVELFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQW9CLEVBQUUsRUFBRSxDQUMzRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBYSxFQUFFLENBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEYsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBb0IsRUFBRSxFQUFFLENBQzNELFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBRTVELFNBQVMsQ0FBQyxXQUFXLEdBQUcsbUJBQVcsQ0FBQyJ9

@@ -8,28 +8,28 @@ "use strict";

const timeserie_1 = require("./timeserie");
ava_1.default('TimeSerie.atTime() should return the correct point or null', (t) => {
ava_1.default("TimeSerie.atTime() should return the correct point or null", (t) => {
const data = [
['2021-01-01T00:00:00.000Z', 4],
['2021-01-02T00:00:00.000Z', 5],
['2021-01-03T00:00:00.000Z', 6]
["2021-01-01T00:00:00.000Z", 4],
["2021-01-02T00:00:00.000Z", 5],
["2021-01-03T00:00:00.000Z", 6],
];
const ts = new timeserie_1.TimeSerie('energy', data);
t.is(ts.atTime('2021-01-02T00:00:00.000Z'), 5);
t.is(ts.atTime('2021-01-22T00:00:00.000Z'), null);
const ts = new timeserie_1.TimeSerie("energy", data);
t.is(ts.atTime("2021-01-02T00:00:00.000Z"), 5);
t.is(ts.atTime("2021-01-22T00:00:00.000Z"), null);
});
ava_1.default('TimeSerie.atIndex() should return the correct point', (t) => {
ava_1.default("TimeSerie.atIndex() should return the correct point", (t) => {
const data = [
['2021-01-01T00:00:00.000Z', 4],
['2021-01-02T00:00:00.000Z', 5],
['2021-01-03T00:00:00.000Z', 6]
["2021-01-01T00:00:00.000Z", 4],
["2021-01-02T00:00:00.000Z", 5],
["2021-01-03T00:00:00.000Z", 6],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const ts = new timeserie_1.TimeSerie("energy", data);
t.is(ts.atIndex(1), 5);
});
ava_1.default('TimeSerie.atIndex() should throw when the index is out of bounds', (t) => {
ava_1.default("TimeSerie.atIndex() should throw when the index is out of bounds", (t) => {
const data = [
['2021-01-01T00:00:00.000Z', 4],
['2021-01-02T00:00:00.000Z', 5],
['2021-01-03T00:00:00.000Z', 6]
["2021-01-01T00:00:00.000Z", 4],
["2021-01-02T00:00:00.000Z", 5],
["2021-01-03T00:00:00.000Z", 6],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const ts = new timeserie_1.TimeSerie("energy", data);
t.throws(() => {

@@ -39,76 +39,76 @@ ts.atIndex(100);

});
ava_1.default('TimeSerie.toArray() should return the whole data', (t) => {
ava_1.default("TimeSerie.toArray() should return the whole data", (t) => {
const data = [
['2021-01-01T00:00:00.000Z', 4],
['2021-01-02T00:00:00.000Z', 5],
['2021-01-03T00:00:00.000Z', 6]
["2021-01-01T00:00:00.000Z", 4],
["2021-01-02T00:00:00.000Z", 5],
["2021-01-03T00:00:00.000Z", 6],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const ts = new timeserie_1.TimeSerie("energy", data);
t.deepEqual(data, ts.toArray());
});
ava_1.default('TimeSerie.firstValidIndex() should return the first valid value index', (t) => {
ava_1.default("TimeSerie.firstValidIndex() should return the first valid value index", (t) => {
const data = [
['2021-01-01T00:00:00.000Z', null],
['2021-01-02T00:00:00.000Z', null],
['2021-01-03T00:00:00.000Z', 6],
['2021-01-04T00:00:00.000Z', 7],
['2021-01-05T00:00:00.000Z', 8],
['2021-01-06T00:00:00.000Z', null]
["2021-01-01T00:00:00.000Z", null],
["2021-01-02T00:00:00.000Z", null],
["2021-01-03T00:00:00.000Z", 6],
["2021-01-04T00:00:00.000Z", 7],
["2021-01-05T00:00:00.000Z", 8],
["2021-01-06T00:00:00.000Z", null],
];
const ts = new timeserie_1.TimeSerie('energy', data);
t.is(ts.firstValidIndex(), '2021-01-03T00:00:00.000Z');
const ts = new timeserie_1.TimeSerie("energy", data);
t.is(ts.firstValidIndex(), "2021-01-03T00:00:00.000Z");
});
ava_1.default('TimeSerie.lastValidIndex() should return the last valid value index', (t) => {
ava_1.default("TimeSerie.lastValidIndex() should return the last valid value index", (t) => {
const data = [
['2021-01-01', null],
['2021-01-02', null],
['2021-01-03', 6],
['2021-01-04', 7],
['2021-01-05', 8],
['2021-01-06', null]
["2021-01-01", null],
["2021-01-02", null],
["2021-01-03", 6],
["2021-01-04", 7],
["2021-01-05", 8],
["2021-01-06", null],
];
const ts = new timeserie_1.TimeSerie('energy', data);
t.is(ts.lastValidIndex(), '2021-01-05T00:00:00.000Z');
const ts = new timeserie_1.TimeSerie("energy", data);
t.is(ts.lastValidIndex(), "2021-01-05T00:00:00.000Z");
});
ava_1.default('TimeSerie.firstValidValue() should return the first valid value index or null', (t) => {
ava_1.default("TimeSerie.firstValidValue() should return the first valid value index or null", (t) => {
const data = [
['2021-01-01', null],
['2021-01-02', null],
['2021-01-03', 6],
['2021-01-04', 7],
['2021-01-05', 8],
['2021-01-06', null]
["2021-01-01", null],
["2021-01-02", null],
["2021-01-03", 6],
["2021-01-04", 7],
["2021-01-05", 8],
["2021-01-06", null],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const ts = new timeserie_1.TimeSerie("energy", data);
t.is(ts.firstValidValue(), 6);
const data2 = [
['2021-01-01', null],
['2021-01-02', null]
["2021-01-01", null],
["2021-01-02", null],
];
const ts2 = new timeserie_1.TimeSerie('energy2', data2);
const ts2 = new timeserie_1.TimeSerie("energy2", data2);
t.is(ts2.firstValidValue(), null);
});
ava_1.default('TimeSerie.lastValidValue() should return the last valid value index', (t) => {
ava_1.default("TimeSerie.lastValidValue() should return the last valid value index", (t) => {
const data = [
['2021-01-01', null],
['2021-01-02', null],
['2021-01-03', 6],
['2021-01-04', 7],
['2021-01-05', 8],
['2021-01-06', null]
["2021-01-01", null],
["2021-01-02", null],
["2021-01-03", 6],
["2021-01-04", 7],
["2021-01-05", 8],
["2021-01-06", null],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const ts = new timeserie_1.TimeSerie("energy", data);
t.is(ts.lastValidValue(), 8);
});
ava_1.default('TimeSerie.betweenTime() should return the correct timeserie subset', (t) => {
ava_1.default("TimeSerie.betweenTime() should return the correct timeserie subset", (t) => {
const data = [
['2021-01-01', 4],
['2021-01-02', 5],
['2021-01-03', 6],
['2021-01-04', 7],
['2021-01-05', 8],
['2021-01-06', 9]
["2021-01-01", 4],
["2021-01-02", 5],
["2021-01-03", 6],
["2021-01-04", 7],
["2021-01-05", 8],
["2021-01-06", 9],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const subset = ts.betweenTime('2021-01-03', '2021-01-05');
const ts = new timeserie_1.TimeSerie("energy", data);
const subset = ts.betweenTime("2021-01-03", "2021-01-05");
t.is(subset.length(), 3);

@@ -118,12 +118,12 @@ t.is(subset.firstValidValue(), 6);

});
ava_1.default('TimeSerie.filter() should allow to pass custom filtering logic', (t) => {
ava_1.default("TimeSerie.filter() should allow to pass custom filtering logic", (t) => {
const data = [
['2021-01-01', 4],
['2021-01-02', 5],
['2021-01-03', 6],
['2021-01-04', 7],
['2021-01-05', 8],
['2021-01-06', 9]
["2021-01-01", 4],
["2021-01-02", 5],
["2021-01-03", 6],
["2021-01-04", 7],
["2021-01-05", 8],
["2021-01-06", 9],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const ts = new timeserie_1.TimeSerie("energy", data);
const filtered = ts.filter((p) => {

@@ -136,12 +136,12 @@ return p[1] % 2 === 0;

});
ava_1.default('TimeSerie.map() should allow to pass custom mapping logic', (t) => {
ava_1.default("TimeSerie.map() should allow to pass custom mapping logic", (t) => {
const data = [
['2021-01-01', 4],
['2021-01-02', 5],
['2021-01-03', 6],
['2021-01-04', 7],
['2021-01-05', 8],
['2021-01-06', 9]
["2021-01-01", 4],
["2021-01-02", 5],
["2021-01-03", 6],
["2021-01-04", 7],
["2021-01-05", 8],
["2021-01-06", 9],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const ts = new timeserie_1.TimeSerie("energy", data);
const mapped = ts.map((p) => {

@@ -154,125 +154,129 @@ return [p[0], p[1] * 2];

});
ava_1.default('TimeSerie.isEmpty() should behave correctly', (t) => {
const data = [
['2021-01-01', 4]
];
const ts1 = new timeserie_1.TimeSerie('energy', data);
const ts2 = new timeserie_1.TimeSerie('energy', []);
ava_1.default("TimeSerie.isEmpty() should behave correctly", (t) => {
const data = [["2021-01-01", 4]];
const ts1 = new timeserie_1.TimeSerie("energy", data);
const ts2 = new timeserie_1.TimeSerie("energy", []);
t.is(ts1.isEmpty(), false);
t.is(ts2.isEmpty(), true);
});
ava_1.default('Timeserie.sum() should return the sum of the values', (t) => {
ava_1.default("Timeserie.sum() should return the sum of the values", (t) => {
const data = [
['2021-01-01', 4],
['2021-01-02', 5],
['2021-01-03', null],
['2021-01-04', 7],
['2021-01-05', 8],
['2021-01-06', 9]
["2021-01-01", 4],
["2021-01-02", 5],
["2021-01-03", null],
["2021-01-04", 7],
["2021-01-05", 8],
["2021-01-06", 9],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const ts = new timeserie_1.TimeSerie("energy", data);
t.is(ts.sum()[1], 33);
});
ava_1.default('Timeserie.avg() should return the average of the values', (t) => {
ava_1.default("Timeserie.avg() should return the average of the values", (t) => {
const data = [
['2021-01-01', 4],
['2021-01-02', 4],
['2021-01-03', null]
["2021-01-01", 4],
["2021-01-02", 4],
["2021-01-03", null],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const ts = new timeserie_1.TimeSerie("energy", data);
t.is(ts.avg()[1], 4);
});
ava_1.default('Timeserie.first() should return the first point or null', (t) => {
const ts1 = new timeserie_1.TimeSerie('ts1', [['2021-01-01', 4]]);
const ts2 = new timeserie_1.TimeSerie('ts2', []);
ava_1.default("Timeserie.first() should return the first point or null", (t) => {
const ts1 = new timeserie_1.TimeSerie("ts1", [["2021-01-01", 4]]);
const ts2 = new timeserie_1.TimeSerie("ts2", []);
t.is(ts1.first()[1], 4);
t.is(ts2.first(), null);
});
ava_1.default('Timeserie.firstAt() should return the first point with time >= the given', (t) => {
ava_1.default("Timeserie.firstAt() should return the first point with time >= the given", (t) => {
const data = [
['2021-01-01', 4],
['2021-01-02', 4],
['2021-01-04', 8],
['2021-01-05', 8]
["2021-01-01", 4],
["2021-01-02", 4],
["2021-01-04", 8],
["2021-01-05", 8],
];
const ts = new timeserie_1.TimeSerie('energy', data);
t.is(ts.firstAt('2021-01-02')[1], 4);
t.is(ts.firstAt('2021-01-03')[1], 8);
const ts = new timeserie_1.TimeSerie("energy", data);
t.is(ts.firstAt("2021-01-02")[1], 4);
t.is(ts.firstAt("2021-01-03")[1], 8);
});
ava_1.default('Timeserie.last() should return the last point or null', (t) => {
const ts1 = new timeserie_1.TimeSerie('ts1', [['2021-01-01', 4], ['2021-01-02', 5]]);
const ts2 = new timeserie_1.TimeSerie('ts2', []);
ava_1.default("Timeserie.last() should return the last point or null", (t) => {
const ts1 = new timeserie_1.TimeSerie("ts1", [
["2021-01-01", 4],
["2021-01-02", 5],
]);
const ts2 = new timeserie_1.TimeSerie("ts2", []);
t.is(ts1.last()[1], 5);
t.is(ts2.last(), null);
});
ava_1.default('Timeserie.max() should return the point with maximum value', (t) => {
ava_1.default("Timeserie.max() should return the point with maximum value", (t) => {
const data = [
['2021-01-01', 4],
['2021-01-02', 11],
['2021-01-04', 8],
['2021-01-05', 8]
["2021-01-01", 4],
["2021-01-02", 11],
["2021-01-04", 8],
["2021-01-05", 8],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const ts = new timeserie_1.TimeSerie("energy", data);
t.is(ts.max()[1], 11);
});
ava_1.default('Timeserie.min() should return the point with minimum value', (t) => {
ava_1.default("Timeserie.min() should return the point with minimum value", (t) => {
const data = [
['2021-01-01', 4],
['2021-01-02', 11],
['2021-01-04', 8],
['2021-01-05', 8]
["2021-01-01", 4],
["2021-01-02", 11],
["2021-01-04", 8],
["2021-01-05", 8],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const ts = new timeserie_1.TimeSerie("energy", data);
t.is(ts.min()[1], 4);
});
ava_1.default('Timeserie.partition() should partition the timeserie', (t) => {
ava_1.default("Timeserie.partition() should partition the timeserie", (t) => {
const data = [
['2021-01-01T12:00:00.000Z', 4],
['2021-01-01T20:00:00.000Z', 4],
['2021-01-02T12:00:00.000Z', 4],
['2021-01-02T20:00:00.000Z', 4],
['2021-01-03T12:00:00.000Z', 4],
['2021-01-03T13:00:00.000Z', 4],
['2021-01-03T20:00:00.000Z', 4],
['2021-01-04T12:00:00.000Z', 4],
['2021-01-04T16:00:00.000Z', 4],
['2021-01-04T20:00:00.000Z', 4]
["2021-01-01T12:00:00.000Z", 4],
["2021-01-01T20:00:00.000Z", 4],
["2021-01-02T12:00:00.000Z", 4],
["2021-01-02T20:00:00.000Z", 4],
["2021-01-03T12:00:00.000Z", 4],
["2021-01-03T13:00:00.000Z", 4],
["2021-01-03T20:00:00.000Z", 4],
["2021-01-04T12:00:00.000Z", 4],
["2021-01-04T16:00:00.000Z", 4],
["2021-01-04T20:00:00.000Z", 4],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const ts = new timeserie_1.TimeSerie("energy", data);
const chunks = ts.partition({ interval: 1000 * 60 * 60 * 24 });
t.is(chunks.length, 4);
});
ava_1.default('Timeserie.reduce() should reduce the timeserie', (t) => {
ava_1.default("Timeserie.reduce() should reduce the timeserie", (t) => {
const data = [
['2021-01-01T12:00:00.000Z', 4],
['2021-01-01T20:00:00.000Z', 4],
['2021-01-02T12:00:00.000Z', 4],
['2021-01-02T20:00:00.000Z', 4],
['2021-01-03T12:00:00.000Z', 4],
['2021-01-03T13:00:00.000Z', 4],
['2021-01-03T20:00:00.000Z', 4],
['2021-01-04T12:00:00.000Z', 4],
['2021-01-04T16:00:00.000Z', 4],
['2021-01-04T20:00:00.000Z', 4]
["2021-01-01T12:00:00.000Z", 4],
["2021-01-01T20:00:00.000Z", 4],
["2021-01-02T12:00:00.000Z", 4],
["2021-01-02T20:00:00.000Z", 4],
["2021-01-03T12:00:00.000Z", 4],
["2021-01-03T13:00:00.000Z", 4],
["2021-01-03T20:00:00.000Z", 4],
["2021-01-04T12:00:00.000Z", 4],
["2021-01-04T16:00:00.000Z", 4],
["2021-01-04T20:00:00.000Z", 4],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const result = ts.reduce({ operation: 'sum' });
const ts = new timeserie_1.TimeSerie("energy", data);
const result = ts.reduce({ operation: "sum" });
t.is(result.length(), 1);
t.is(result.atIndex(0), 40);
});
ava_1.default('Timeserie.resample(operation=sum) should provide the correct timeserie', (t) => {
ava_1.default("Timeserie.resample(operation=sum) should provide the correct timeserie", (t) => {
const data = [
['2021-01-01T12:00:00.000Z', 4],
['2021-01-01T20:00:00.000Z', 4],
['2021-01-02T12:00:00.000Z', 4],
['2021-01-02T20:00:00.000Z', 4],
['2021-01-03T12:00:00.000Z', 4],
['2021-01-03T13:00:00.000Z', 4],
['2021-01-03T20:00:00.000Z', 4],
['2021-01-04T12:00:00.000Z', 4],
['2021-01-04T16:00:00.000Z', 4],
['2021-01-04T20:00:00.000Z', 4]
["2021-01-01T12:00:00.000Z", 4],
["2021-01-01T20:00:00.000Z", 4],
["2021-01-02T12:00:00.000Z", 4],
["2021-01-02T20:00:00.000Z", 4],
["2021-01-03T12:00:00.000Z", 4],
["2021-01-03T13:00:00.000Z", 4],
["2021-01-03T20:00:00.000Z", 4],
["2021-01-04T12:00:00.000Z", 4],
["2021-01-04T16:00:00.000Z", 4],
["2021-01-04T20:00:00.000Z", 4],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const daily = ts.resample({ interval: 1000 * 60 * 60 * 24, operation: 'sum' });
const ts = new timeserie_1.TimeSerie("energy", data);
const daily = ts.resample({
interval: 1000 * 60 * 60 * 24,
operation: "sum",
});
t.is(daily.length(), 4);

@@ -284,17 +288,20 @@ t.is(daily.atIndex(0), 8);

});
ava_1.default('Timeserie.resample().avg() should provide the correct timeserie', (t) => {
ava_1.default("Timeserie.resample().avg() should provide the correct timeserie", (t) => {
const data = [
['2021-01-01T12:00:00.000Z', 4],
['2021-01-01T20:00:00.000Z', 4],
['2021-01-02T12:00:00.000Z', 4],
['2021-01-02T20:00:00.000Z', 4],
['2021-01-03T12:00:00.000Z', 4],
['2021-01-03T13:00:00.000Z', 4],
['2021-01-03T20:00:00.000Z', 4],
['2021-01-04T12:00:00.000Z', 4],
['2021-01-04T16:00:00.000Z', 4],
['2021-01-04T20:00:00.000Z', 4]
["2021-01-01T12:00:00.000Z", 4],
["2021-01-01T20:00:00.000Z", 4],
["2021-01-02T12:00:00.000Z", 4],
["2021-01-02T20:00:00.000Z", 4],
["2021-01-03T12:00:00.000Z", 4],
["2021-01-03T13:00:00.000Z", 4],
["2021-01-03T20:00:00.000Z", 4],
["2021-01-04T12:00:00.000Z", 4],
["2021-01-04T16:00:00.000Z", 4],
["2021-01-04T20:00:00.000Z", 4],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const daily = ts.resample({ interval: 1000 * 60 * 60 * 24, operation: 'avg' });
const ts = new timeserie_1.TimeSerie("energy", data);
const daily = ts.resample({
interval: 1000 * 60 * 60 * 24,
operation: "avg",
});
t.is(daily.length(), 4);

@@ -306,17 +313,20 @@ t.is(daily.atIndex(0), 4);

});
ava_1.default('Timeserie.resample().first() should provide the correct timeserie', (t) => {
ava_1.default("Timeserie.resample().first() should provide the correct timeserie", (t) => {
const data = [
['2021-01-01T12:00:00.000Z', 1],
['2021-01-01T20:00:00.000Z', 2],
['2021-01-02T12:00:00.000Z', 1],
['2021-01-02T20:00:00.000Z', 2],
['2021-01-03T12:00:00.000Z', 1],
['2021-01-03T13:00:00.000Z', 2],
['2021-01-03T20:00:00.000Z', 3],
['2021-01-04T12:00:00.000Z', 1],
['2021-01-04T16:00:00.000Z', 2],
['2021-01-04T20:00:00.000Z', 3]
["2021-01-01T12:00:00.000Z", 1],
["2021-01-01T20:00:00.000Z", 2],
["2021-01-02T12:00:00.000Z", 1],
["2021-01-02T20:00:00.000Z", 2],
["2021-01-03T12:00:00.000Z", 1],
["2021-01-03T13:00:00.000Z", 2],
["2021-01-03T20:00:00.000Z", 3],
["2021-01-04T12:00:00.000Z", 1],
["2021-01-04T16:00:00.000Z", 2],
["2021-01-04T20:00:00.000Z", 3],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const daily = ts.resample({ interval: 1000 * 60 * 60 * 24, operation: 'first' });
const ts = new timeserie_1.TimeSerie("energy", data);
const daily = ts.resample({
interval: 1000 * 60 * 60 * 24,
operation: "first",
});
t.is(daily.length(), 4);

@@ -328,17 +338,20 @@ t.is(daily.atIndex(0), 1);

});
ava_1.default('Timeserie.resample().last() should provide the correct timeserie', (t) => {
ava_1.default("Timeserie.resample().last() should provide the correct timeserie", (t) => {
const data = [
['2021-01-01T12:00:00.000Z', 1],
['2021-01-01T20:00:00.000Z', 2],
['2021-01-02T12:00:00.000Z', 1],
['2021-01-02T20:00:00.000Z', 2],
['2021-01-03T12:00:00.000Z', 1],
['2021-01-03T13:00:00.000Z', 2],
['2021-01-03T20:00:00.000Z', 3],
['2021-01-04T12:00:00.000Z', 1],
['2021-01-04T16:00:00.000Z', 2],
['2021-01-04T20:00:00.000Z', 3]
["2021-01-01T12:00:00.000Z", 1],
["2021-01-01T20:00:00.000Z", 2],
["2021-01-02T12:00:00.000Z", 1],
["2021-01-02T20:00:00.000Z", 2],
["2021-01-03T12:00:00.000Z", 1],
["2021-01-03T13:00:00.000Z", 2],
["2021-01-03T20:00:00.000Z", 3],
["2021-01-04T12:00:00.000Z", 1],
["2021-01-04T16:00:00.000Z", 2],
["2021-01-04T20:00:00.000Z", 3],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const daily = ts.resample({ interval: 1000 * 60 * 60 * 24, operation: 'last' });
const ts = new timeserie_1.TimeSerie("energy", data);
const daily = ts.resample({
interval: 1000 * 60 * 60 * 24,
operation: "last",
});
t.is(daily.length(), 4);

@@ -350,17 +363,20 @@ t.is(daily.atIndex(0), 2);

});
ava_1.default('Timeserie.resample().max() should provide the correct timeserie', (t) => {
ava_1.default("Timeserie.resample().max() should provide the correct timeserie", (t) => {
const data = [
['2021-01-01T12:00:00.000Z', 1],
['2021-01-01T20:00:00.000Z', 2],
['2021-01-02T12:00:00.000Z', 4],
['2021-01-02T20:00:00.000Z', 2],
['2021-01-03T12:00:00.000Z', 8],
['2021-01-03T13:00:00.000Z', 11],
['2021-01-03T20:00:00.000Z', 3],
['2021-01-04T12:00:00.000Z', 100],
['2021-01-04T16:00:00.000Z', 2],
['2021-01-04T20:00:00.000Z', 3]
["2021-01-01T12:00:00.000Z", 1],
["2021-01-01T20:00:00.000Z", 2],
["2021-01-02T12:00:00.000Z", 4],
["2021-01-02T20:00:00.000Z", 2],
["2021-01-03T12:00:00.000Z", 8],
["2021-01-03T13:00:00.000Z", 11],
["2021-01-03T20:00:00.000Z", 3],
["2021-01-04T12:00:00.000Z", 100],
["2021-01-04T16:00:00.000Z", 2],
["2021-01-04T20:00:00.000Z", 3],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const daily = ts.resample({ interval: 1000 * 60 * 60 * 24, operation: 'max' });
const ts = new timeserie_1.TimeSerie("energy", data);
const daily = ts.resample({
interval: 1000 * 60 * 60 * 24,
operation: "max",
});
t.is(daily.length(), 4);

@@ -372,17 +388,20 @@ t.is(daily.atIndex(0), 2);

});
ava_1.default('Timeserie.resample().min() should provide the correct timeserie', (t) => {
ava_1.default("Timeserie.resample().min() should provide the correct timeserie", (t) => {
const data = [
['2021-01-01T12:00:00.000Z', 1],
['2021-01-01T20:00:00.000Z', 2],
['2021-01-02T12:00:00.000Z', 4],
['2021-01-02T20:00:00.000Z', 2],
['2021-01-03T12:00:00.000Z', 8],
['2021-01-03T13:00:00.000Z', 11],
['2021-01-03T20:00:00.000Z', 3],
['2021-01-04T12:00:00.000Z', 100],
['2021-01-04T16:00:00.000Z', 2],
['2021-01-04T20:00:00.000Z', 3]
["2021-01-01T12:00:00.000Z", 1],
["2021-01-01T20:00:00.000Z", 2],
["2021-01-02T12:00:00.000Z", 4],
["2021-01-02T20:00:00.000Z", 2],
["2021-01-03T12:00:00.000Z", 8],
["2021-01-03T13:00:00.000Z", 11],
["2021-01-03T20:00:00.000Z", 3],
["2021-01-04T12:00:00.000Z", 100],
["2021-01-04T16:00:00.000Z", 2],
["2021-01-04T20:00:00.000Z", 3],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const daily = ts.resample({ interval: 1000 * 60 * 60 * 24, operation: 'min' });
const ts = new timeserie_1.TimeSerie("energy", data);
const daily = ts.resample({
interval: 1000 * 60 * 60 * 24,
operation: "min",
});
t.is(daily.length(), 4);

@@ -394,17 +413,20 @@ t.is(daily.atIndex(0), 1);

});
ava_1.default('Timeserie.resample().delta() should provide the correct timeserie', (t) => {
ava_1.default("Timeserie.resample().delta() should provide the correct timeserie", (t) => {
const data = [
['2021-01-01T12:00:00.000Z', 1],
['2021-01-01T20:00:00.000Z', 2],
['2021-01-02T12:00:00.000Z', 3],
['2021-01-02T20:00:00.000Z', 4],
['2021-01-03T12:00:00.000Z', 5],
['2021-01-03T13:00:00.000Z', 8],
['2021-01-03T20:00:00.000Z', 9],
['2021-01-04T12:00:00.000Z', 10],
['2021-01-04T16:00:00.000Z', 12],
['2021-01-04T20:00:00.000Z', 15]
["2021-01-01T12:00:00.000Z", 1],
["2021-01-01T20:00:00.000Z", 2],
["2021-01-02T12:00:00.000Z", 3],
["2021-01-02T20:00:00.000Z", 4],
["2021-01-03T12:00:00.000Z", 5],
["2021-01-03T13:00:00.000Z", 8],
["2021-01-03T20:00:00.000Z", 9],
["2021-01-04T12:00:00.000Z", 10],
["2021-01-04T16:00:00.000Z", 12],
["2021-01-04T20:00:00.000Z", 15],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const daily = ts.resample({ interval: 1000 * 60 * 60 * 24, operation: 'delta' });
const ts = new timeserie_1.TimeSerie("energy", data);
const daily = ts.resample({
interval: 1000 * 60 * 60 * 24,
operation: "delta",
});
t.is(daily.length(), 4);

@@ -417,22 +439,22 @@ t.is(daily.data[0][0], data[0][0]); // The resampling should start at the first time index

});
ava_1.default('Timeserie.removeAt() should remove points from the timeserie', (t) => {
ava_1.default("Timeserie.removeAt() should remove points from the timeserie", (t) => {
const data = [
['2021-01-01T00:00:00.000Z', 1],
['2021-01-02T00:00:00.000Z', 2],
['2021-01-03T00:00:00.000Z', 3],
['2021-01-04T00:00:00.000Z', 4]
["2021-01-01T00:00:00.000Z", 1],
["2021-01-02T00:00:00.000Z", 2],
["2021-01-03T00:00:00.000Z", 3],
["2021-01-04T00:00:00.000Z", 4],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const filtered = ts.removeAt('2021-01-03T00:00:00.000Z');
const ts = new timeserie_1.TimeSerie("energy", data);
const filtered = ts.removeAt("2021-01-03T00:00:00.000Z");
t.is(filtered.length(), 3);
t.is(filtered.atIndex(2), 4);
});
ava_1.default('Timeserie.removeAtIndex() should remove points from the timeserie', (t) => {
ava_1.default("Timeserie.removeAtIndex() should remove points from the timeserie", (t) => {
const data = [
['2021-01-01T00:00:00.000Z', 1],
['2021-01-02T00:00:00.000Z', 2],
['2021-01-03T00:00:00.000Z', 3],
['2021-01-04T00:00:00.000Z', 4]
["2021-01-01T00:00:00.000Z", 1],
["2021-01-02T00:00:00.000Z", 2],
["2021-01-03T00:00:00.000Z", 3],
["2021-01-04T00:00:00.000Z", 4],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const ts = new timeserie_1.TimeSerie("energy", data);
const filtered = ts.removeAtIndex(0);

@@ -442,23 +464,23 @@ t.is(filtered.length(), 3);

});
ava_1.default('Timeserie.removeBetweenTime() should remove points from the timeserie', (t) => {
ava_1.default("Timeserie.removeBetweenTime() should remove points from the timeserie", (t) => {
const data = [
['2021-01-01T00:00:00.000Z', 1],
['2021-01-02T00:00:00.000Z', 2],
['2021-01-03T00:00:00.000Z', 3],
['2021-01-04T00:00:00.000Z', 4]
["2021-01-01T00:00:00.000Z", 1],
["2021-01-02T00:00:00.000Z", 2],
["2021-01-03T00:00:00.000Z", 3],
["2021-01-04T00:00:00.000Z", 4],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const filtered = ts.removeBetweenTime('2021-01-02T00:00:00.000Z', '2021-01-03T00:00:00.000Z');
const ts = new timeserie_1.TimeSerie("energy", data);
const filtered = ts.removeBetweenTime("2021-01-02T00:00:00.000Z", "2021-01-03T00:00:00.000Z");
t.is(filtered.length(), 2);
t.is(filtered.atIndex(1), 4);
});
ava_1.default('Timeserie.dropNaN() should remove points from the timeserie', (t) => {
ava_1.default("Timeserie.dropNaN() should remove points from the timeserie", (t) => {
const data = [
['2021-01-01T00:00:00.000Z', 1],
['2021-01-01T00:00:00.000Z', NaN],
['2021-01-02T00:00:00.000Z', 'hello'],
['2021-01-03T00:00:00.000Z', {}],
['2021-01-04T00:00:00.000Z', 4]
["2021-01-01T00:00:00.000Z", 1],
["2021-01-01T00:00:00.000Z", NaN],
["2021-01-02T00:00:00.000Z", "hello"],
["2021-01-03T00:00:00.000Z", {}],
["2021-01-04T00:00:00.000Z", 4],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const ts = new timeserie_1.TimeSerie("energy", data);
const filtered = ts.dropNaN();

@@ -468,55 +490,71 @@ t.is(filtered.length(), 2);

});
ava_1.default('Timeserie.dropNull() should remove points from the timeserie', (t) => {
ava_1.default("Timeserie.dropNull() should remove points from the timeserie", (t) => {
const data = [
['2021-01-01T00:00:00.000Z', 1],
['2021-01-02T00:00:00.000Z', 'hello'],
['2021-01-03T00:00:00.000Z', null],
['2021-01-04T00:00:00.000Z', 4]
["2021-01-01T00:00:00.000Z", 1],
["2021-01-02T00:00:00.000Z", "hello"],
["2021-01-03T00:00:00.000Z", null],
["2021-01-04T00:00:00.000Z", 4],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const ts = new timeserie_1.TimeSerie("energy", data);
const filtered = ts.dropNull();
t.is(filtered.length(), 3);
t.is(filtered.atIndex(1), 'hello');
t.is(filtered.atIndex(1), "hello");
t.is(filtered.atIndex(2), 4);
});
ava_1.default('Timeserie.indexes() and Timeserie.values() should return correct values', (t) => {
ava_1.default("Timeserie.indexes() and Timeserie.values() should return correct values", (t) => {
const data = [
['2021-01-01T00:00:00.000Z', 1],
['2021-01-02T00:00:00.000Z', 'hello']
["2021-01-01T00:00:00.000Z", 1],
["2021-01-02T00:00:00.000Z", "hello"],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const ts = new timeserie_1.TimeSerie("energy", data);
const indexes = ts.indexes();
const values = ts.values();
t.is(indexes[0], '2021-01-01T00:00:00.000Z');
t.is(indexes[1], '2021-01-02T00:00:00.000Z');
t.is(indexes[0], "2021-01-01T00:00:00.000Z");
t.is(indexes[1], "2021-01-02T00:00:00.000Z");
t.is(values[0], 1);
t.is(values[1], 'hello');
t.is(values[1], "hello");
});
ava_1.default('Timeserie.reindex() should correctly replace the series index', (t) => {
ava_1.default("Timeserie.reindex() should correctly replace the series index", (t) => {
const data = [
['2021-01-01T00:00:00.000Z', 1],
['2021-01-02T00:00:00.000Z', 2]
["2021-01-01T00:00:00.000Z", 1],
["2021-01-02T00:00:00.000Z", 2],
];
const ts = new timeserie_1.TimeSerie('energy', data);
const reindexed = ts.reindex(timeserie_1.TimeSerie.createIndex({ from: ts.firstValidIndex(), to: ts.lastValidIndex(), interval: '1h' }), { fill: 0 });
const ts = new timeserie_1.TimeSerie("energy", data);
const reindexed = ts.reindex(timeserie_1.TimeSerie.createIndex({
from: ts.firstValidIndex(),
to: ts.lastValidIndex(),
interval: "1h",
}), { fill: 0 });
t.is(reindexed.length(), 25);
});
ava_1.default('Timeserie.fromIndex() should correctly create the series', (t) => {
const idx = timeserie_1.TimeSerie.createIndex({ from: '2022-01-01', to: '2022-01-01T23:00:00.000Z', interval: '1h' });
const ts = timeserie_1.TimeSerie.fromIndex(idx, { fill: 1, name: 'ts' });
ava_1.default("Timeserie.fromIndex() should correctly create the series", (t) => {
const idx = timeserie_1.TimeSerie.createIndex({
from: "2022-01-01",
to: "2022-01-01T23:00:00.000Z",
interval: "1h",
});
const ts = timeserie_1.TimeSerie.fromIndex(idx, { fill: 1, name: "ts" });
t.is(ts.length(), 24);
t.is(true, ts.toArray().every((item) => item[1] === 1));
});
ava_1.default('Timeserie.combine() should correctly combine the series', (t) => {
const idx = timeserie_1.TimeSerie.createIndex({ from: '2022-01-01', to: '2022-01-01T23:00:00.000Z', interval: '1h' });
const ts1 = timeserie_1.TimeSerie.fromIndex(idx, { fill: 1, name: 'ts1' });
const ts2 = timeserie_1.TimeSerie.fromIndex(idx, { fill: 2, name: 'ts2' });
const result = ts1.combine('add', [ts2]);
ava_1.default("Timeserie.combine() should correctly combine the series", (t) => {
const idx = timeserie_1.TimeSerie.createIndex({
from: "2022-01-01",
to: "2022-01-01T23:00:00.000Z",
interval: "1h",
});
const ts1 = timeserie_1.TimeSerie.fromIndex(idx, { fill: 1, name: "ts1" });
const ts2 = timeserie_1.TimeSerie.fromIndex(idx, { fill: 2, name: "ts2" });
const result = ts1.combine("add", [ts2]);
t.is(result.length(), ts1.length());
t.is(true, result.toArray().every((item) => item[1] === 3));
});
ava_1.default('Timeserie.add() should correctly add the series to numbers and other series', (t) => {
const idx = timeserie_1.TimeSerie.createIndex({ from: '2022-01-01', to: '2022-01-01T23:00:00.000Z', interval: '1h' });
const ts1 = timeserie_1.TimeSerie.fromIndex(idx, { fill: 1, name: 'ts1' });
const ts2 = timeserie_1.TimeSerie.fromIndex(idx, { fill: 2, name: 'ts2' });
ava_1.default("Timeserie.add() should correctly add the series to numbers and other series", (t) => {
const idx = timeserie_1.TimeSerie.createIndex({
from: "2022-01-01",
to: "2022-01-01T23:00:00.000Z",
interval: "1h",
});
const ts1 = timeserie_1.TimeSerie.fromIndex(idx, { fill: 1, name: "ts1" });
const ts2 = timeserie_1.TimeSerie.fromIndex(idx, { fill: 2, name: "ts2" });
const ts3 = ts1.add(ts2).add(7);

@@ -526,6 +564,10 @@ t.is(ts3.length(), ts1.length());

});
ava_1.default('Timeserie.sub() should correctly diff the series to numbers and other series', (t) => {
const idx = timeserie_1.TimeSerie.createIndex({ from: '2022-01-01', to: '2022-01-01T23:00:00.000Z', interval: '1h' });
const ts1 = timeserie_1.TimeSerie.fromIndex(idx, { fill: 8, name: 'ts1' });
const ts2 = timeserie_1.TimeSerie.fromIndex(idx, { fill: 4, name: 'ts2' });
ava_1.default("Timeserie.sub() should correctly diff the series to numbers and other series", (t) => {
const idx = timeserie_1.TimeSerie.createIndex({
from: "2022-01-01",
to: "2022-01-01T23:00:00.000Z",
interval: "1h",
});
const ts1 = timeserie_1.TimeSerie.fromIndex(idx, { fill: 8, name: "ts1" });
const ts2 = timeserie_1.TimeSerie.fromIndex(idx, { fill: 4, name: "ts2" });
const ts3 = ts1.sub(ts2).sub(7);

@@ -535,6 +577,10 @@ t.is(ts3.length(), ts1.length());

});
ava_1.default('Timeserie.mul() should correctly multiply the series to numbers and other series', (t) => {
const idx = timeserie_1.TimeSerie.createIndex({ from: '2022-01-01', to: '2022-01-01T23:00:00.000Z', interval: '1h' });
const ts1 = timeserie_1.TimeSerie.fromIndex(idx, { fill: 1, name: 'ts1' });
const ts2 = timeserie_1.TimeSerie.fromIndex(idx, { fill: 2, name: 'ts2' });
ava_1.default("Timeserie.mul() should correctly multiply the series to numbers and other series", (t) => {
const idx = timeserie_1.TimeSerie.createIndex({
from: "2022-01-01",
to: "2022-01-01T23:00:00.000Z",
interval: "1h",
});
const ts1 = timeserie_1.TimeSerie.fromIndex(idx, { fill: 1, name: "ts1" });
const ts2 = timeserie_1.TimeSerie.fromIndex(idx, { fill: 2, name: "ts2" });
const ts3 = ts1.mul(ts2).mul(7);

@@ -544,6 +590,10 @@ t.is(ts3.length(), ts1.length());

});
ava_1.default('Timeserie.div() should correctly divide the series to numbers and other series', (t) => {
const idx = timeserie_1.TimeSerie.createIndex({ from: '2022-01-01', to: '2022-01-01T23:00:00.000Z', interval: '1h' });
const ts1 = timeserie_1.TimeSerie.fromIndex(idx, { fill: 16, name: 'ts1' });
const ts2 = timeserie_1.TimeSerie.fromIndex(idx, { fill: 4, name: 'ts2' });
ava_1.default("Timeserie.div() should correctly divide the series to numbers and other series", (t) => {
const idx = timeserie_1.TimeSerie.createIndex({
from: "2022-01-01",
to: "2022-01-01T23:00:00.000Z",
interval: "1h",
});
const ts1 = timeserie_1.TimeSerie.fromIndex(idx, { fill: 16, name: "ts1" });
const ts2 = timeserie_1.TimeSerie.fromIndex(idx, { fill: 4, name: "ts2" });
const ts3 = ts1.div(ts2).div(4);

@@ -553,2 +603,20 @@ t.is(ts3.length(), ts1.length());

});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXNlcmllLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RpbWVzZXJpZS5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsOENBQXNCO0FBRXRCLDJDQUF1QztBQUd2QyxhQUFJLENBQUMsNERBQTRELEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUN2RSxNQUFNLElBQUksR0FBWTtRQUNwQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztLQUNoQyxDQUFBO0lBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxxQkFBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUV4QyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUM5QyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUNuRCxDQUFDLENBQUMsQ0FBQTtBQUVGLGFBQUksQ0FBQyxxREFBcUQsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQ2hFLE1BQU0sSUFBSSxHQUFZO1FBQ3BCLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO0tBQ2hDLENBQUE7SUFDRCxNQUFNLEVBQUUsR0FBRyxJQUFJLHFCQUFTLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBRXhDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUN4QixDQUFD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Q0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQzFCLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUM1QixDQUFDLENBQUMsQ0FBQTtBQUVGLGFBQUksQ0FBQyxpRUFBaUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQzVFLE1BQU0sSUFBSSxHQUFZO1FBQ3BCLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO0tBQ2hDLENBQUE7SUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFJLHFCQUFTLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3hDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQzlFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3ZCLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUN6QixDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDekIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3pCLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUMzQixDQUFDLENBQUMsQ0FBQTtBQUVGLGFBQUksQ0FBQyxtRUFBbUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQzlFLE1BQU0sSUFBSSxHQUFZO1FBQ3BCLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO0tBQ2hDLENBQUE7SUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFJLHFCQUFTLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3hDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBRWhGLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3ZCLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUN6QixDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDekIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3pCLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUMzQixDQUFDLENBQUMsQ0FBQTtBQUVGLGFBQUksQ0FBQyxrRUFBa0UsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQzdFLE1BQU0sSUFBSSxHQUFZO1FBQ3BCLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO0tBQ2hDLENBQUE7SUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFJLHFCQUFTLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3hDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFBO0lBRS9FLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3ZCLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUN6QixDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDekIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3pCLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUMzQixDQUFDLENBQUMsQ0FBQTtBQUVGLGFBQUksQ0FBQyxpRUFBaUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQzVFLE1BQU0sSUFBSSxHQUFZO1FBQ3BCLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxDQUFDO1FBQ2hDLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsR0FBRyxDQUFDO1FBQ2pDLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO0tBQ2hDLENBQUE7SUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFJLHFCQUFTLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3hDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBRTlFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3ZCLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUN6QixDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDekIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQzFCLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtBQUM3QixDQUFDLENBQUMsQ0FBQTtBQUVGLGFBQUksQ0FBQyxpRUFBaUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQzVFLE1BQU0sSUFBSSxHQUFZO1FBQ3BCLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxDQUFDO1FBQ2hDLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsR0FBRyxDQUFDO1FBQ2pDLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO0tBQ2hDLENBQUE7SUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFJLHFCQUFTLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3hDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBRTlFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3ZCLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUN6QixDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDekIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3pCLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUMzQixDQUFDLENBQUMsQ0FBQTtBQUVGLGFBQUksQ0FBQyxtRUFBbUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQzlFLE1BQU0sSUFBSSxHQUFZO1FBQ3BCLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxDQUFDO1FBQ2hDLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxDQUFDO1FBQ2hDLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxDQUFDO0tBQ2pDLENBQUE7SUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFJLHFCQUFTLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3hDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBQ2hGLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3ZCLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLHNEQUFzRDtJQUN6RixDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDekIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3pCLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUN6QixDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFDM0IsQ0FBQyxDQUFDLENBQUE7QUFFRixhQUFJLENBQUMsOERBQThELEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUN6RSxNQUFNLElBQUksR0FBWTtRQUNwQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztLQUNoQyxDQUFBO0lBRUQsTUFBTSxFQUFFLEdBQUcsSUFBSSxxQkFBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUN4QyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLENBQUE7SUFFeEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDMUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBQzlCLENBQUMsQ0FBQyxDQUFBO0FBRUYsYUFBSSxDQUFDLG1FQUFtRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDOUUsTUFBTSxJQUFJLEdBQVk7UUFDcEIsQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUM7S0FDaEMsQ0FBQTtJQUVELE1BQU0sRUFBRSxHQUFHLElBQUkscUJBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDeEMsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUVwQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUMxQixDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFDOUIsQ0FBQyxDQUFDLENBQUE7QUFFRixhQUFJLENBQUMsdUVBQXVFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUNsRixNQUFNLElBQUksR0FBWTtRQUNwQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztLQUNoQyxDQUFBO0lBRUQsTUFBTSxFQUFFLEdBQUcsSUFBSSxxQkFBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUN4QyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUMsMEJBQTBCLEVBQUUsMEJBQTBCLENBQUMsQ0FBQTtJQUU3RixDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUMxQixDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFDOUIsQ0FBQyxDQUFDLENBQUE7QUFFRixhQUFJLENBQUMsNkRBQTZELEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUN4RSxNQUFNLElBQUksR0FBWTtRQUNwQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLDBCQUEwQixFQUFFLEdBQUcsQ0FBQztRQUNqQyxDQUFDLDBCQUEwQixFQUFFLE9BQU8sQ0FBQztRQUNyQyxDQUFDLDBCQUEwQixFQUFFLEVBQUUsQ0FBQztRQUNoQyxDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztLQUNoQyxDQUFBO0lBRUQsTUFBTSxFQUFFLEdBQUcsSUFBSSxxQkFBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUN4QyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUE7SUFFN0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDMUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBQzlCLENBQUMsQ0FBQyxDQUFBO0FBRUYsYUFBSSxDQUFDLDhEQUE4RCxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDekUsTUFBTSxJQUFJLEdBQVk7UUFDcEIsQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQywwQkFBMEIsRUFBRSxPQUFPLENBQUM7UUFDckMsQ0FBQywwQkFBMEIsRUFBRSxJQUFJLENBQUM7UUFDbEMsQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUM7S0FDaEMsQ0FBQTtJQUVELE1BQU0sRUFBRSxHQUFHLElBQUkscUJBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDeEMsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFBO0lBRTlCLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQzFCLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUNsQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFDOUIsQ0FBQyxDQUFDLENBQUE7QUFFRixhQUFJLENBQUMseUVBQXlFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUNwRixNQUFNLElBQUksR0FBWTtRQUNwQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLDBCQUEwQixFQUFFLE9BQU8sQ0FBQztLQUN0QyxDQUFBO0lBRUQsTUFBTSxFQUFFLEdBQUcsSUFBSSxxQkFBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUN4QyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDNUIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFBO0lBRTFCLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLDBCQUEwQixDQUFDLENBQUE7SUFDNUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsMEJBQTBCLENBQUMsQ0FBQTtJQUM1QyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUMxQixDQUFDLENBQUMsQ0FBQTtBQUVGLGFBQUksQ0FBQywrREFBK0QsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQzFFLE1BQU0sSUFBSSxHQUFZO1FBQ3BCLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO0tBQ2hDLENBQUE7SUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFJLHFCQUFTLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBRXhDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMscUJBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLGVBQWUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUN6SSxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUM5QixDQUFDLENBQUMsQ0FBQTtBQUVGLGFBQUksQ0FBQywwREFBMEQsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQ3JFLE1BQU0sR0FBRyxHQUFHLHFCQUFTLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsMEJBQTBCLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7SUFDekcsTUFBTSxFQUFFLEdBQUcscUJBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUU1RCxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUNyQixDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUMvRCxDQUFDLENBQUMsQ0FBQTtBQUVGLGFBQUksQ0FBQyx5REFBeUQsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQ3BFLE1BQU0sR0FBRyxHQUFHLHFCQUFTLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsMEJBQTBCLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7SUFDekcsTUFBTSxHQUFHLEdBQUcscUJBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtJQUM5RCxNQUFNLEdBQUcsR0FBRyxxQkFBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQzlELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENB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
ava_1.default("Timeserie.split() should split the timeserie", (t) => {
const data = [
["2021-01-01T12:00:00.000Z", 181],
["2021-01-01T20:00:00.000Z", 181],
["2021-01-02T12:00:00.000Z", 181],
["2021-01-02T20:00:00.000Z", 181],
["2021-01-03T12:00:00.000Z", 181],
["2021-01-03T13:00:00.000Z", 181],
["2021-01-03T20:00:00.000Z", 181],
["2021-01-04T12:00:00.000Z", 181],
["2021-01-04T16:00:00.000Z", 181],
["2021-01-04T20:00:00.000Z", 181],
];
const ts = new timeserie_1.TimeSerie("energy", data);
const result = ts.split({ chunks: 3 });
t.is(result.length, 4);
t.deepEqual(result.map((ts) => ts.length()), [3, 3, 3, 1]);
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXNlcmllLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RpbWVzZXJpZS5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsOENBQXVCO0FBRXZCLDJDQUF3QztBQUd4QyxhQUFJLENBQUMsNERBQTRELEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUN2RSxNQUFNLElBQUksR0FBWTtRQUNwQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztLQUNoQyxDQUFDO0lBQ0YsTUFBTSxFQUFFLEdBQUcsSUFBSSxxQkFBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUV6QyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNwRCxDQUFDLENBQUMsQ0FBQztBQUVILGFBQUksQ0FBQyxxREFBcUQsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQ2hFLE1BQU0sSUFBSSxHQUFZO1FBQ3BCLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO0tBQ2hDLENBQUM7SUFDRixNQUFNLEVBQUUsR0FBRyxJQUFJLHFCQUFTLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRXpDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6QixDQUFD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

@@ -1,2 +0,2 @@

import { TimeSerie } from './timeserie';
import { TimeSerie } from "./timeserie";
export declare type PointValue = number | string | boolean | any;

@@ -57,3 +57,3 @@ export declare type DateLike = Date | string | number;

export declare type TimeserieIterator = (value: TimeSerie, index: number, array: ReadonlyArray<TimeSerie>) => any;
export declare type ColumnAggregation = 'avg' | 'last' | 'first' | 'min' | 'max' | 'delta' | 'sum';
export declare type ColumnAggregation = "avg" | "last" | "first" | "min" | "max" | "delta" | "sum";
export declare type ResampleDefaultAggregation = ColumnAggregation;

@@ -88,6 +88,6 @@ export declare type IntervalOptions = {

output: string;
operation: 'add' | 'mul' | 'div' | 'sub' | 'avg' | TimeseriePointCombiner;
operation: "add" | "mul" | "div" | "sub" | "avg" | TimeseriePointCombiner;
columns: string[];
}
export declare type ReduceOperation = 'min' | 'max' | 'first' | 'last' | 'avg' | 'sum' | 'delta';
export declare type ReduceOperation = "min" | "max" | "first" | "last" | "avg" | "sum" | "delta";
export declare type TimeFrameReduceOptions = {

@@ -106,3 +106,3 @@ operation: ReduceOperation;

}
export declare type PipelineStageType = 'aggregate' | 'resample' | 'project' | 'reduce' | 'add' | 'mul';
export declare type PipelineStageType = "aggregate" | "resample" | "project" | "reduce" | "add" | "mul";
export declare type PipelineStage = {

@@ -116,2 +116,9 @@ aggregate?: AggregationConfiguration;

};
export declare type SplitOptions = {
chunks: number;
};
export declare type BetweenTimeOptions = {
includeInferior: boolean;
includeSuperior: boolean;
};
export declare class TimeInterval {

@@ -118,0 +125,0 @@ from: Date;

@@ -8,5 +8,2 @@ "use strict";

const parse_duration_1 = __importDefault(require("parse-duration"));
;
;
;
class TimeInterval {

@@ -39,3 +36,3 @@ constructor(from, to) {

let size = options.interval;
if (typeof options.interval === 'string') {
if (typeof options.interval === "string") {
size = parse_duration_1.default(options.interval);

@@ -53,2 +50,2 @@ }

exports.createIndex = createIndex;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9FQUFrQztBQVlqQyxDQUFDO0FBR0QsQ0FBQztBQThCRCxDQUFDO0FBMEZGLE1BQWEsWUFBWTtJQUl2QixZQUFhLElBQVUsRUFBRSxFQUFRO1FBQy9CLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFBO1FBQ2hCLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFBO1FBQ1osSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBQzNDLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUFFLElBQWMsRUFBRSxFQUFZLEVBQUUsUUFBZ0I7UUFDN0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDeEIsSUFBSSxNQUFNLEdBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDakMsTUFBTSxTQUFTLEdBQW1CLEVBQUUsQ0FBQTtRQUNwQyxPQUFPLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDdkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDN0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUE7WUFDdkQsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtZQUM5QyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7U0FDeEI7UUFDRCxPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0NBQ0Y7QUF0QkQsb0NBc0JDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLFdBQVcsQ0FBRSxPQUE2QjtJQUN4RCxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFBO0lBQzNCLElBQUksT0FBTyxPQUFPLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRTtRQUN4QyxJQUFJLEdBQUcsd0JBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7S0FDL0I7SUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDaEMsTUFBTSxNQUFNLEdBQVMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzNDLE1BQU0sS0FBSyxHQUFVLEVBQUUsQ0FBQTtJQUN2QixPQUFPLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDeEMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQTtRQUNoQyxNQUFNLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsR0FBSSxJQUFlLENBQUMsQ0FBQTtLQUNwRTtJQUNELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQWJELGtDQWFDIn0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9FQUFtQztBQW1MbkMsTUFBYSxZQUFZO0lBSXZCLFlBQVksSUFBVSxFQUFFLEVBQVE7UUFDOUIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFRLENBQ2IsSUFBYyxFQUNkLEVBQVksRUFDWixRQUFnQjtRQUVoQixNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QixJQUFJLE1BQU0sR0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxNQUFNLFNBQVMsR0FBbUIsRUFBRSxDQUFDO1FBQ3JDLE9BQU8sTUFBTSxDQUFDLE9BQU8sRUFBRSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUN2QyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQztZQUN4RCxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQy9DLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN6QjtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQTFCRCxvQ0EwQkM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsV0FBVyxDQUFDLE9BQTZCO0lBQ3ZELElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDNUIsSUFBSSxPQUFPLE9BQU8sQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFO1FBQ3hDLElBQUksR0FBRyx3QkFBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUNoQztJQUNELE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqQyxNQUFNLE1BQU0sR0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsTUFBTSxLQUFLLEdBQVUsRUFBRSxDQUFDO0lBQ3hCLE9BQU8sTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUN4QyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxHQUFJLElBQWUsQ0FBQyxDQUFDO0tBQ3JFO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBYkQsa0NBYUMifQ==

@@ -1,5 +0,5 @@

import { DateLike } from './types';
import { DateLike } from "./types";
export declare function ms(date: Date | string): number;
export declare function DateLikeToString(d: DateLike): string;
export declare function DateLikeToTimestamp(d: DateLike): number;
export declare function getOrderOfMagnitude(n: number): number;
export declare function chunk(arr: any[], chunk_size: number): any[][];
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getOrderOfMagnitude = exports.DateLikeToTimestamp = exports.DateLikeToString = exports.ms = void 0;
exports.chunk = exports.DateLikeToTimestamp = exports.DateLikeToString = exports.ms = void 0;
function ms(date) {

@@ -9,5 +9,5 @@ return new Date(date).getTime();

function DateLikeToString(d) {
if (typeof d === 'string' && !isNaN(new Date(Number(d)).getTime())) {
return new Date(Number(d)).toISOString();
}
// if (typeof d === "string" && !isNaN(new Date(Number(d)).getTime())) {
// return new Date(Number(d)).toISOString();
// }
return new Date(d).toISOString();

@@ -17,3 +17,3 @@ }

function DateLikeToTimestamp(d) {
if (typeof d === 'string' && !isNaN(new Date(Number(d)).getTime())) {
if (typeof d === "string" && !isNaN(new Date(Number(d)).getTime())) {
return new Date(Number(d)).getTime();

@@ -24,8 +24,8 @@ }

exports.DateLikeToTimestamp = DateLikeToTimestamp;
function getOrderOfMagnitude(n) {
const order = Math.floor(Math.log(n) / Math.LN10 +
0.000000001); // because float math sucks like that
return Math.pow(10, order);
function chunk(arr, chunk_size) {
return new Array(Math.ceil(arr.length / chunk_size))
.fill(0)
.map((_, i) => arr.slice(i * chunk_size, (i + 1) * chunk_size));
}
exports.getOrderOfMagnitude = getOrderOfMagnitude;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLFNBQWdCLEVBQUUsQ0FBRSxJQUFtQjtJQUNyQyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFBO0FBQ2pDLENBQUM7QUFGRCxnQkFFQztBQUVELFNBQWdCLGdCQUFnQixDQUFFLENBQVc7SUFDM0MsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRTtRQUNsRSxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO0tBQ3pDO0lBQ0QsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtBQUNsQyxDQUFDO0FBTEQsNENBS0M7QUFFRCxTQUFnQixtQkFBbUIsQ0FBRSxDQUFXO0lBQzlDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUU7UUFDbEUsT0FBTyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtLQUNyQztJQUNELE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUE7QUFDOUIsQ0FBQztBQUxELGtEQUtDO0FBRUQsU0FBZ0IsbUJBQW1CLENBQUUsQ0FBUTtJQUMzQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUk7UUFDM0IsV0FBVyxDQUFDLENBQUEsQ0FBQyxxQ0FBcUM7SUFDdkUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQTtBQUM1QixDQUFDO0FBSkQsa0RBSUMifQ==
exports.chunk = chunk;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLFNBQWdCLEVBQUUsQ0FBQyxJQUFtQjtJQUNwQyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ2xDLENBQUM7QUFGRCxnQkFFQztBQUVELFNBQWdCLGdCQUFnQixDQUFDLENBQVc7SUFDMUMsd0VBQXdFO0lBQ3hFLDhDQUE4QztJQUM5QyxJQUFJO0lBQ0osT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUNuQyxDQUFDO0FBTEQsNENBS0M7QUFFRCxTQUFnQixtQkFBbUIsQ0FBQyxDQUFXO0lBQzdDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUU7UUFDbEUsT0FBTyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztLQUN0QztJQUNELE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDL0IsQ0FBQztBQUxELGtEQUtDO0FBRUQsU0FBZ0IsS0FBSyxDQUFDLEdBQVUsRUFBRSxVQUFrQjtJQUNsRCxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsQ0FBQztTQUNqRCxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ1AsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUpELHNCQUlDIn0=

@@ -1,3 +0,3 @@

import { TimeSerie } from './timeserie';
import { AggregationConfiguration, DateLike, FromTimeseriesOptions, Index, Metadata, PointValue, ReindexOptions, Row, TelemetryV1Output, TimeFrameInternal, PartitionOptions, TimeFrameResampleOptions, TimeframeRowsIterator, TimeserieIterator, TimeFrameReduceOptions, ProjectionOptions, PipelineStage } from './types';
import { TimeSerie } from "./timeserie";
import { AggregationConfiguration, DateLike, FromTimeseriesOptions, Index, Metadata, ReindexOptions, Row, TelemetryV1Output, PartitionOptions, TimeFrameResampleOptions, TimeframeRowsIterator, TimeserieIterator, TimeFrameReduceOptions, ProjectionOptions, PipelineStage, SplitOptions, BetweenTimeOptions } from "./types";
interface TimeFrameOptions {

@@ -16,2 +16,3 @@ data: Row[];

private _indexes;
private _columns;
/**

@@ -23,8 +24,8 @@ * Creates a Timeframe instance from a list of rows. It infers the list of column names from each row's fields.

constructor(options: TimeFrameOptions);
private buildTimeCheckpoints;
private buildTimeTree;
/**
* Creates a new timeframe preserving the metadata but replacing data
* @param data The new data to recreate the serie from
* @returns
*/
* Creates a new timeframe preserving the metadata but replacing data
* @param data The new data to recreate the serie from
* @returns
*/
recreate(data: Row[]): TimeFrame;

@@ -46,13 +47,11 @@ /**

/**
*
* Creates a TimeFrame from a Telemetry Output Object (Apio private method)
* @param data An object which is telemetry V1 output (Apio Internal)
* @returns
*/
static fromTelemetryV1Output(data?: TelemetryV1Output, metadata?: Metadata): TimeFrame;
static fromInternalFormat(data: TimeFrameInternal, metadata?: Metadata): TimeFrame;
private static fromInternalFormat;
/**
*
* Returns a new TimeFrame, where each input timeserie is used as column
* @param timeseries An array of TimeSerie objects
* @param options.fill Value to use as filler when a column does not hold a value for a specific time
* @returns A new TimeFrame, where each timeserie represent a column
*/

@@ -67,2 +66,8 @@ static fromTimeseries(timeseries: TimeSerie[], options?: FromTimeseriesOptions): TimeFrame;

/**
* Merges together rows and columns of the specified timeframes.
* If two or more timeframes present a value for the same column at the same time, the first timeframe in the array has priority.
* @param timeframes Array of timeframes to merge
*/
static merge(timeframes: TimeFrame[]): TimeFrame;
/**
* Joins multiple timeframes by adding the columns together and merging indexes (time)

@@ -80,13 +85,17 @@ * @param timeframes Array of timeframes to join together

/**
*
* Returns the column as timeseries
* @param name The name of the wanted column
* @returns The column as timeseries
*/
column(name: string): TimeSerie;
/**
* Returns every column as array of timeseries
*/
columns(): TimeSerie[];
/**
*
* @returns Array of rows
* Returns all the rows in an array
*/
rows(): Row[];
/**
* Returns the time index array
*/
indexes(): DateLike[];

@@ -98,27 +107,27 @@ /**

/**
*
* Returns a row at a given time or null
* @param time
* @returns A row at a given time or null
*/
atTime(time: string): Row | null;
/**
*
* @returns The row at the given index (position, not time)
* Get the row at the given index (position, not time)
*/
atIndex(index: number): PointValue;
atIndex(index: number): Row;
/**
* Returns the number of rows
*/
length(): number;
/**
* Returns the shape of the timeframe
* @returns Array<Number> The shape of the timeframe expressed as [rows, columns] where columns excludes the time column
* Returns the shape of the timeframe expressed as [rows, columns] where columns excludes the time column
*/
shape(): number[];
/**
*
* @returns The first row
*/
*
* Returns the first row
*/
first(): Row;
/**
*
* @returns The last row
*/
*
* Returns the last row
*/
last(): Row;

@@ -154,11 +163,7 @@ /**

/**
*
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
* @returns The subset of points between the two dates. Extremes are included.
*/
betweenTime(from: DateLike, to: DateLike, options?: {
includeInferior: boolean;
includeSuperior: boolean;
}): TimeFrame;
* Returns the subset of points between the two dates. Extremes are included.
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
*/
betweenTime(from: DateLike, to: DateLike, options?: BetweenTimeOptions): TimeFrame;
/**

@@ -175,3 +180,3 @@ * Applies transformations to TimeFrame. Each transformation is defined as an operation between columns. Allows, for example, to

* tf = tf.aggregate({ output: 'power1', columns: ['voltage1', 'current1'], operation: 'mul' })
* .aggregate({ output: 'power', columns: ['power1', 'power2', 'power3'], operation: 'add'})
* .aggregate({ output: 'power', columns: ['power1', 'power2', 'power3'], operation: 'add'})
*/

@@ -188,2 +193,7 @@ aggregate(agg: AggregationConfiguration): TimeFrame;

reduce(options: TimeFrameReduceOptions): TimeFrame;
/**
* Resamples the timeframe by the specified time interval. Each row
* of the result TimeFrame will be the result of the selected aggregation.
* @param options
*/
resample(options: TimeFrameResampleOptions): TimeFrame;

@@ -197,6 +207,6 @@ /**

/**
* Returns a new timeframe where each **row** is mapped by the iterator function. For mapping over columns, use apply()
* @param fn Iterator function
* @returns {TimeFrame}
*/
* Returns a new timeframe where each **row** is mapped by the iterator function. For mapping over columns, use apply()
* @param fn Iterator function
* @returns {TimeFrame}
*/
map(fn: TimeframeRowsIterator): TimeFrame;

@@ -213,6 +223,10 @@ /**

* @param options
* @returns
*/
partition(options: PartitionOptions): TimeFrame[];
/**
* Splits a timeframe into multiple timeframes where each timeframe has
* a maximum of `options.chunks` rows.
*/
split(options: SplitOptions): TimeFrame[];
/**
* Runs a series of transformations defined as an object. Useful in automation.

@@ -219,0 +233,0 @@ * A stage is an object with a single key and a value, the key is the name of the method, the value is the params object

@@ -1,4 +0,4 @@

import { TimeSerie } from './timeserie';
import { TimeInterval } from './types';
import { getOrderOfMagnitude } from './utils';
import { TimeSerie } from "./timeserie";
import { TimeInterval, } from "./types";
import { chunk, DateLikeToString } from "./utils";
const test = (r, f, t, includeSuperior, includeInferior) => {

@@ -18,2 +18,3 @@ if (includeInferior && includeSuperior) {

};
const makeTree = require("functional-red-black-tree");
/**

@@ -33,2 +34,3 @@ * @class TimeFrame

this.metadata = {};
this._columns = {};
const { data, metadata = {} } = options;

@@ -42,7 +44,7 @@ // get a list of unique column names excluding the time key

else {
this.columnNames = [...new Set(data
this.columnNames = [
...new Set(data
.filter((row) => !!row)
.map((row) => Object.keys(row))
.flat())]
.filter((name) => name !== 'time');
.flatMap((row) => Object.keys(row))),
].filter((name) => name !== "time");
this.data = data

@@ -63,3 +65,6 @@ .concat([])

const { time, ...rest } = row;
acc[row.time] ? acc[row.time] = { ...acc[row.time], ...rest } : acc[row.time] = rest;
const fTime = DateLikeToString(time);
acc[fTime]
? (acc[fTime] = { ...acc[fTime], ...rest })
: (acc[fTime] = rest);
return acc;

@@ -70,21 +75,22 @@ }, {});

time: Object.keys(this.data).sort(),
checkpoints: null
tree: null,
};
}
buildTimeCheckpoints() {
if (!this._indexes.checkpoints) {
this._indexes.checkpoints = {};
const o = getOrderOfMagnitude(this._indexes.time.length);
this._indexes.time.forEach((el, i) => {
if (i % (o / 100) === 0) {
this._indexes.checkpoints[el] = i;
}
buildTimeTree() {
if (!this._indexes.tree) {
let tree = makeTree(function (a, b) {
return a - b;
});
this._indexes.time.forEach((time) => {
const t = new Date(time).getTime();
tree = tree.insert(t, t);
});
this._indexes.tree = tree;
}
}
/**
* Creates a new timeframe preserving the metadata but replacing data
* @param data The new data to recreate the serie from
* @returns
*/
* Creates a new timeframe preserving the metadata but replacing data
* @param data The new data to recreate the serie from
* @returns
*/
recreate(data) {

@@ -114,5 +120,4 @@ return new TimeFrame({ data, metadata: this.metadata });

/**
*
* Creates a TimeFrame from a Telemetry Output Object (Apio private method)
* @param data An object which is telemetry V1 output (Apio Internal)
* @returns
*/

@@ -125,3 +130,3 @@ static fromTelemetryV1Output(data = {}, metadata = {}) {

if (!_data[time]) {
_data[time] = {};
_data[DateLikeToString(time)] = {};
}

@@ -131,5 +136,5 @@ const column = `${deviceId}:${propertyName}`;

deviceId,
propertyName
propertyName,
};
_data[time][column] = value;
_data[DateLikeToString(time)][column] = value;
}

@@ -139,3 +144,3 @@ }

const rows = Object.keys(_data).map((time) => {
return { time, ..._data[time] };
return { time, ..._data[DateLikeToString(time)] };
});

@@ -151,6 +156,5 @@ return new TimeFrame({ data: rows, metadata });

/**
*
* Returns a new TimeFrame, where each input timeserie is used as column
* @param timeseries An array of TimeSerie objects
* @param options.fill Value to use as filler when a column does not hold a value for a specific time
* @returns A new TimeFrame, where each timeserie represent a column
*/

@@ -160,9 +164,10 @@ static fromTimeseries(timeseries, options) {

const metadata = {};
timeseries.forEach(ts => {
const idx = [...new Set(timeseries.flatMap((ts) => ts.indexes()))];
timeseries.forEach((ts) => {
metadata[ts.name] = ts.metadata;
ts.toArray().forEach((point) => {
data[point[0]] = data[point[0]] || {};
data[point[0]][ts.name] = point[1] || options?.fill || null;
});
});
idx.forEach((i) => {
data[i] = {};
timeseries.forEach((ts) => (data[i][ts.name] = ts.atTime(i) || options?.fill || null));
});
return TimeFrame.fromInternalFormat(data, metadata);

@@ -177,7 +182,18 @@ }

return new TimeFrame({
metadata: Object.assign({}, ...timeframes.map(tf => tf.metadata)),
data: timeframes.map((tf) => tf.rows()).flat()
metadata: Object.assign({}, ...timeframes.map((tf) => tf.metadata)),
data: timeframes.flatMap((tf) => tf.rows()),
});
}
/**
* Merges together rows and columns of the specified timeframes.
* If two or more timeframes present a value for the same column at the same time, the first timeframe in the array has priority.
* @param timeframes Array of timeframes to merge
*/
static merge(timeframes) {
if (timeframes.length < 2) {
throw new Error("merge() requires at least two timeframes");
}
return timeframes[0].join(timeframes.slice(1));
}
/**
* Joins multiple timeframes by adding the columns together and merging indexes (time)

@@ -188,3 +204,16 @@ * @param timeframes Array of timeframes to join together

join(timeframes) {
return TimeFrame.fromInternalFormat(Object.assign({}, ...(timeframes.map(tf => tf.data).concat([this.data]))));
const allTf = timeframes.concat([this]);
// Todo should support a filler value, at the moment it just does not define values in rows
// when a row misses a certain column's value
// const allColumns: string[] = [
// ...new Set(allTf.flatMap((tf) => tf.columnNames)),
// ];
const mergedIndex = [...new Set(allTf.flatMap((tf) => tf.indexes()))];
const rows = mergedIndex.map((idx) => ({
time: idx,
...allTf
.map((tf) => tf.atTime(idx))
.reduce((prev, acc) => Object.assign(acc, prev), this.atTime(idx)),
}));
return this.recreate(rows);
}

@@ -200,5 +229,4 @@ /**

/**
*
* Returns the column as timeseries
* @param name The name of the wanted column
* @returns The column as timeseries
*/

@@ -209,6 +237,16 @@ column(name) {

}
const data = Object.entries(this.data).map(([time, values]) => ([time, values[name]]));
const metadata = this.metadata[name] || {};
return new TimeSerie(name, data, metadata);
// we cache the column to make subsequent reads faster
if (!this._columns[name]) {
const data = Object.entries(this.data).map(([time, values]) => [
time,
values[name],
]);
const metadata = this.metadata[name] || {};
this._columns[name] = new TimeSerie(name, data, metadata);
}
return this._columns[name];
}
/**
* Returns every column as array of timeseries
*/
columns() {

@@ -218,8 +256,13 @@ return this.columnNames.map((column) => this.column(column));

/**
*
* @returns Array of rows
* Returns all the rows in an array
*/
rows() {
return Object.entries(this.data).map(([time, values]) => ({ time, ...values }));
return Object.entries(this.data).map(([time, values]) => ({
time,
...values,
}));
}
/**
* Returns the time index array
*/
indexes() {

@@ -234,3 +277,3 @@ return this._indexes.time;

if (nonExisting.length > 0) {
throw new Error(`Non existing columns ${nonExisting.join(',')}`);
throw new Error(`Non existing columns ${nonExisting.join(",")}`);
}

@@ -242,19 +285,20 @@ const tf = TimeFrame.fromTimeseries(config.columns.map((columnName) => this.column(columnName)));

/**
*
* Returns a row at a given time or null
* @param time
* @returns A row at a given time or null
*/
atTime(time) {
return { time, ...this.data[time] } || null;
return { time, ...this.data[DateLikeToString(time)] } || null;
}
/**
*
* @returns The row at the given index (position, not time)
* Get the row at the given index (position, not time)
*/
atIndex(index) {
if (index >= this.rows().length) {
throw new Error('Index out of bounds');
throw new Error("Index out of bounds");
}
return this.rows()[index];
}
/**
* Returns the number of rows
*/
length() {

@@ -264,4 +308,3 @@ return this._indexes.time.length;

/**
* Returns the shape of the timeframe
* @returns Array<Number> The shape of the timeframe expressed as [rows, columns] where columns excludes the time column
* Returns the shape of the timeframe expressed as [rows, columns] where columns excludes the time column
*/

@@ -272,5 +315,5 @@ shape() {

/**
*
* @returns The first row
*/
*
* Returns the first row
*/
first() {

@@ -283,5 +326,5 @@ if (this.length() === 0) {

/**
*
* @returns The last row
*/
*
* Returns the last row
*/
last() {

@@ -302,3 +345,6 @@ if (this.length() === 0) {

const time = this.first().time;
return this.columns().reduce((acc, column) => { acc[column.name] = column.sum()[1]; return acc; }, { time });
return this.columns().reduce((acc, column) => {
acc[column.name] = column.sum()[1];
return acc;
}, { time });
}

@@ -313,3 +359,6 @@ /**

const time = this.first().time;
return this.columns().reduce((acc, column) => { acc[column.name] = column.avg()[1]; return acc; }, { time });
return this.columns().reduce((acc, column) => {
acc[column.name] = column.avg()[1];
return acc;
}, { time });
}

@@ -324,3 +373,6 @@ /**

const time = this.first().time;
return this.columns().reduce((acc, column) => { acc[column.name] = column.delta()[1]; return acc; }, { time });
return this.columns().reduce((acc, column) => {
acc[column.name] = column.delta()[1];
return acc;
}, { time });
}

@@ -335,3 +387,6 @@ /**

const time = this.first().time;
return this.columns().reduce((acc, column) => { acc[column.name] = column.max()[1]; return acc; }, { time });
return this.columns().reduce((acc, column) => {
acc[column.name] = column.max()[1];
return acc;
}, { time });
}

@@ -346,3 +401,6 @@ /**

const time = this.first().time;
return this.columns().reduce((acc, column) => { acc[column.name] = column.min()[1]; return acc; }, { time });
return this.columns().reduce((acc, column) => {
acc[column.name] = column.min()[1];
return acc;
}, { time });
}

@@ -362,40 +420,27 @@ /**

/**
*
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
* @returns The subset of points between the two dates. Extremes are included.
*/
betweenTime(from, to, options = { includeInferior: true, includeSuperior: true }) {
* Returns the subset of points between the two dates. Extremes are included.
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
*/
betweenTime(from, to, options = {
includeInferior: true,
includeSuperior: true,
}) {
/**
* Here we might have to scan a huge sorted array. To prevent scanning too many useless keys
* we index the array by mapping a certain number of timestamps to positions in the time index.
*
* This sparse index is smaller than the full index and fester to use for scanning ranges like in this case.
* Here we might have to scan a huge sorted array. To prevent scanning too many useless keys. To get better performances we index timestamps with a RBtree in the buildTimeTree funciton
*/
this.buildTimeCheckpoints();
this.buildTimeTree();
const { includeInferior, includeSuperior } = options;
const f = new Date(from).getTime();
const t = new Date(to).getTime();
const keys = Object.keys(this._indexes.checkpoints);
// Indice della prima chiave che va oltre il from
const startingPointValueIndex = keys.findIndex((key) => new Date(key).getTime() > from);
// Ultimo timestamp prima di quell'indice
let startingPoint = this._indexes.checkpoints[keys[startingPointValueIndex - 1]];
if (!startingPoint) {
// Siamo oltre l'ultimo checkpoint
const lastCheckpoint = keys[keys.length - 1];
startingPoint = this._indexes.checkpoints[lastCheckpoint];
}
const goodRows = [];
for (let i = startingPoint; i < this._indexes.time.length; i++) {
const curr = new Date(this._indexes.time[i]).getTime();
if (curr < f) {
continue;
const iter = this._indexes.tree.ge(f);
while (iter && new Date(iter.key).getTime() <= t) {
if (test(iter.key, f, t, includeSuperior, includeInferior)) {
goodRows.push({
time: new Date(iter.key).toISOString(),
...this.data[DateLikeToString(iter.key)],
});
}
if (curr > t) {
break;
}
if (test(curr, f, t, includeSuperior, includeInferior)) {
goodRows.push({ time: this._indexes.time[i], ...this.data[this._indexes.time[i]] });
}
iter.next();
}

@@ -415,3 +460,3 @@ return this.recreate(goodRows);

* tf = tf.aggregate({ output: 'power1', columns: ['voltage1', 'current1'], operation: 'mul' })
* .aggregate({ output: 'power', columns: ['power1', 'power2', 'power3'], operation: 'add'})
* .aggregate({ output: 'power', columns: ['power1', 'power2', 'power3'], operation: 'add'})
*/

@@ -423,10 +468,11 @@ aggregate(agg) {

let newColumn;
if (typeof agg.operation === 'function') {
if (typeof agg.operation === "function") {
newColumn = TimeSerie.internals.combine(columnsToAggregate, agg.operation, { name: agg.output });
}
else if (typeof agg.operation === 'string' && agg.operation in TimeSerie.internals.combiners) {
else if (typeof agg.operation === "string" &&
agg.operation in TimeSerie.internals.combiners) {
newColumn = TimeSerie.internals.combine(columnsToAggregate, TimeSerie.internals.combiners[agg.operation], { name: agg.output });
}
else {
throw new Error('Wrong type for aggregation operation');
throw new Error("Wrong type for aggregation operation");
}

@@ -453,13 +499,17 @@ return this.recreateFromSeries([newColumn].concat(this.columns()));

}
/**
* Resamples the timeframe by the specified time interval. Each row
* of the result TimeFrame will be the result of the selected aggregation.
* @param options
*/
resample(options) {
const from = options.from || this.first()?.time;
if (!from) {
throw new Error('Cannot infer a lower bound for resample');
throw new Error("Cannot infer a lower bound for resample");
}
const to = options.to || this.last()?.time;
if (!to) {
throw new Error('Cannot infer an upper bound for resample');
throw new Error("Cannot infer an upper bound for resample");
}
return TimeFrame.concat(this.partition(options)
.map((chunk) => chunk.reduce(options)));
return TimeFrame.concat(this.partition(options).map((chunk) => chunk.reduce(options)));
}

@@ -472,11 +522,17 @@ /**

filter(fn) {
return new TimeFrame({ data: this.rows().filter(fn), metadata: this.metadata });
return new TimeFrame({
data: this.rows().filter(fn),
metadata: this.metadata,
});
}
/**
* Returns a new timeframe where each **row** is mapped by the iterator function. For mapping over columns, use apply()
* @param fn Iterator function
* @returns {TimeFrame}
*/
* Returns a new timeframe where each **row** is mapped by the iterator function. For mapping over columns, use apply()
* @param fn Iterator function
* @returns {TimeFrame}
*/
map(fn) {
return new TimeFrame({ data: this.rows().map(fn), metadata: this.metadata });
return new TimeFrame({
data: this.rows().map(fn),
metadata: this.metadata,
});
}

@@ -490,5 +546,7 @@ /**

apply(fn, columns = this.columnNames) {
const unmodifiedColumns = this.columnNames.filter((columnName) => !columns.includes(columnName)).map((columnName) => this.column(columnName));
const unmodifiedColumns = this.columnNames
.filter((columnName) => !columns.includes(columnName))
.map((columnName) => this.column(columnName));
const series = columns
.map((columnName) => (this.column(columnName)))
.map((columnName) => this.column(columnName))
.map(fn);

@@ -500,3 +558,2 @@ return TimeFrame.fromTimeseries(unmodifiedColumns.concat(series));

* @param options
* @returns
*/

@@ -506,11 +563,14 @@ partition(options) {

if (!from) {
throw new Error('Cannot infer a lower bound for resample');
throw new Error("Cannot infer a lower bound for resample");
}
const to = options.to || this.last()?.time;
if (!to) {
throw new Error('Cannot infer an upper bound for resample');
throw new Error("Cannot infer an upper bound for resample");
}
const intervals = TimeInterval.generate(from, to, options.interval);
const partitions = intervals.map((interval) => {
return this.betweenTime(interval.from, interval.to, { includeInferior: true, includeSuperior: false });
return this.betweenTime(interval.from, interval.to, {
includeInferior: true,
includeSuperior: false,
});
});

@@ -530,2 +590,9 @@ return partitions.map((p, idx) => {

/**
* Splits a timeframe into multiple timeframes where each timeframe has
* a maximum of `options.chunks` rows.
*/
split(options) {
return chunk(this.rows(), options.chunks).map((rows) => this.recreate(rows));
}
/**
* Runs a series of transformations defined as an object. Useful in automation.

@@ -548,2 +615,2 @@ * A stage is an object with a single key and a value, the key is the name of the method, the value is the params object

}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWZyYW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90aW1lZnJhbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUN2QyxPQUFPLEVBQStOLFlBQVksRUFBa0csTUFBTSxTQUFTLENBQUE7QUFDblcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQzdDLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxFQUFFO0lBQ3pELElBQUksZUFBZSxJQUFJLGVBQWUsRUFBRTtRQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtLQUN4QjtTQUFNLElBQUksZUFBZSxJQUFJLENBQUMsZUFBZSxFQUFFO1FBQzlDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0tBQ3ZCO1NBQU0sSUFBSSxDQUFDLGVBQWUsSUFBSSxlQUFlLEVBQUU7UUFDOUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7S0FDdkI7U0FBTTtRQUNMLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0tBQ3RCO0FBQ0gsQ0FBQyxDQUFBO0FBTUQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLFNBQVM7SUFNcEI7Ozs7T0FJRztJQUNILFlBQWEsT0FBeUI7UUFWckIsU0FBSSxHQUFzQixFQUFFLENBQUE7UUFDN0MsZ0JBQVcsR0FBYSxFQUFFLENBQUE7UUFDMUIsYUFBUSxHQUFhLEVBQUUsQ0FBQTtRQVNyQixNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsR0FBRyxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUE7UUFDdkMsMkRBQTJEO1FBQzNELElBQUks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
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWZyYW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90aW1lZnJhbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBY0wsWUFBWSxHQVFiLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbEQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLEVBQUU7SUFDekQsSUFBSSxlQUFlLElBQUksZUFBZSxFQUFFO1FBQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3pCO1NBQU0sSUFBSSxlQUFlLElBQUksQ0FBQyxlQUFlLEVBQUU7UUFDOUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDeEI7U0FBTSxJQUFJLENBQUMsZUFBZSxJQUFJLGVBQWUsRUFBRTtRQUM5QyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUN4QjtTQUFNO1FBQ0wsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDdkI7QUFDSCxDQUFDLENBQUM7QUFPRixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQztBQU10RDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sU0FBUztJQU9wQjs7OztPQUlHO0lBQ0gsWUFBWSxPQUF5QjtRQVhwQixTQUFJLEdBQXNCLEVBQUUsQ0FBQztRQUM5QyxnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQUMzQixhQUFRLEdBQWEsRUFBRSxDQUFDO1FBRWhCLGFBQVEsR0FBOEIsRUFBRSxDQUFDO1FB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Q0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQzFCLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ2QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckMsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQ0QsRUFBRSxJQUFJLEVBQUUsQ0FDVCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsR0FBRztRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRTtZQUN2QixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQztRQUMvQixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQzFCLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ2QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQ0QsRUFBRSxJQUFJLEVBQUUsQ0FDVCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsR0FBRztRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRTtZQUN2QixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQztRQUMvQixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQzFCLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ2QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsT0FB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

@@ -1,21 +0,22 @@

import test from 'ava';
import { TimeFrame } from './timeframe';
import { TimeSerie } from './timeserie';
test('TimeFrame.column() should return the correct timeserie', (t) => {
import test from "ava";
import { TimeFrame } from "./timeframe";
import { TimeSerie } from "./timeserie";
import { DateLikeToString } from "./utils";
test("TimeFrame.column() should return the correct timeserie", (t) => {
const data = [
{ time: '2021-01-01', energy: 1, power: 4 },
{ time: '2021-01-02', energy: 2, power: 8 }
{ time: "2021-01-01", energy: 1, power: 4 },
{ time: "2021-01-02", energy: 2, power: 8 },
];
const tf = new TimeFrame({ data });
const energy = tf.column('energy');
const energy = tf.column("energy");
t.is(true, energy instanceof TimeSerie);
t.is(2, energy.length());
t.is(energy.atTime('2021-01-01'), 1);
t.is(energy.atTime('2021-01-02'), 2);
t.is(energy.atTime("2021-01-01"), 1);
t.is(energy.atTime("2021-01-02"), 2);
});
test('TimeFrame.length() should return the correct value', (t) => {
test("TimeFrame.length() should return the correct value", (t) => {
const data = [
{ time: '2021-01-01', energy: 1, power: 4 },
{ time: '2021-01-01', energy: 1, power: 5 },
{ time: '2021-01-02', energy: 2, power: 8 }
{ time: "2021-01-01", energy: 1, power: 4 },
{ time: "2021-01-01", energy: 1, power: 5 },
{ time: "2021-01-02", energy: 2, power: 8 },
];

@@ -25,7 +26,7 @@ const tf = new TimeFrame({ data });

});
test('TimeFrame.shape() should return the correct value', (t) => {
test("TimeFrame.shape() should return the correct value", (t) => {
const data = [
{ time: '2021-01-01', energy: 1, power: 4 },
{ time: '2021-01-02', energy: 1, power: 5 },
{ time: '2021-01-03', energy: 2, power: 8 }
{ time: "2021-01-01", energy: 1, power: 4 },
{ time: "2021-01-02", energy: 1, power: 5 },
{ time: "2021-01-03", energy: 2, power: 8 },
];

@@ -35,25 +36,29 @@ const tf = new TimeFrame({ data });

});
test('TimeFrame.indexes() should return the correct value', (t) => {
test("TimeFrame.indexes() should return the correct value", (t) => {
const data = [
{ time: '2021-01-03', energy: 1, power: 4 },
{ time: '2021-01-01', energy: 1, power: 5 },
{ time: '2021-01-02', energy: 2, power: 8 }
{ time: "2021-01-03", energy: 1, power: 4 },
{ time: "2021-01-01", energy: 1, power: 5 },
{ time: "2021-01-02", energy: 2, power: 8 },
];
const tf = new TimeFrame({ data });
t.deepEqual(tf.indexes(), ['2021-01-01', '2021-01-02', '2021-01-03']);
t.deepEqual(tf.indexes(), [
DateLikeToString("2021-01-01"),
DateLikeToString("2021-01-02"),
DateLikeToString("2021-01-03"),
]);
});
test('TimeFrame.atTime() should return the correct row', (t) => {
test("TimeFrame.atTime() should return the correct row", (t) => {
const data = [
{ time: '2021-01-01', energy: 1, power: 4 },
{ time: '2021-01-02', energy: 2, power: 8 }
{ time: "2021-01-01", energy: 1, power: 4 },
{ time: "2021-01-02", energy: 2, power: 8 },
];
const tf = new TimeFrame({ data });
const row = tf.atTime('2021-01-02');
const row = tf.atTime("2021-01-02");
t.is(row.energy, 2);
t.is(row.power, 8);
});
test('TimeFrame.toArray() should return an array of rows', (t) => {
test("TimeFrame.toArray() should return an array of rows", (t) => {
const data = [
{ time: '2021-01-01', energy: 1, power: 4 },
{ time: '2021-01-02', energy: 2, power: 8 }
{ time: "2021-01-01T00:00:00.000Z", energy: 1, power: 4 },
{ time: "2021-01-02T00:00:00.000Z", energy: 2, power: 8 },
];

@@ -65,188 +70,251 @@ const tf = new TimeFrame({ data });

});
test('TimeFrame.fromTelemetryV1Output() should return the correct timeframe', (t) => {
test("TimeFrame.fromTelemetryV1Output() should return the correct timeframe", (t) => {
const data = {
device1: {
energy: [['2021-01-01', 1], ['2021-01-02', 2]],
power: [['2021-01-01', 4], ['2021-01-02', 8]]
energy: [
["2021-01-01T00:00:00.000Z", 1],
["2021-01-02T00:00:00.000Z", 2],
],
power: [
["2021-01-01T00:00:00.000Z", 4],
["2021-01-02T00:00:00.000Z", 8],
],
},
device2: {
energy: [['2021-01-01', 1], ['2021-01-02', 2]],
power: [['2021-01-01', 4], ['2021-01-02', 8]]
}
energy: [
["2021-01-01T00:00:00.000Z", 1],
["2021-01-02T00:00:00.000Z", 2],
],
power: [
["2021-01-01T00:00:00.000Z", 4],
["2021-01-02T00:00:00.000Z", 8],
],
},
};
const tf = TimeFrame.fromTelemetryV1Output(data);
const row = tf.atTime('2021-01-01');
t.is(row['device1:energy'], 1);
t.is(row['device1:power'], 4);
const d2energy = tf.column('device2:energy');
t.is(d2energy.metadata.deviceId, 'device2');
t.is(d2energy.metadata.propertyName, 'energy');
const row = tf.atTime("2021-01-01T00:00:00.000Z");
t.is(row["device1:energy"], 1);
t.is(row["device1:power"], 4);
const d2energy = tf.column("device2:energy");
t.is(d2energy.metadata.deviceId, "device2");
t.is(d2energy.metadata.propertyName, "energy");
});
test('TimeFrame.fromTimeseries() should return the correct timeframe', (t) => {
test("TimeFrame.fromTimeseries() should return the correct timeframe", (t) => {
const energyData = [
['2021-01-01T00:00:00.000Z', 4],
['2021-01-02T00:00:00.000Z', 4],
['2021-01-03T00:00:00.000Z', 4]
["2021-01-01T00:00:00.000Z", 4],
["2021-01-02T00:00:00.000Z", 4],
["2021-01-03T00:00:00.000Z", 4],
];
const powerData = [
['2021-01-01T00:00:00.000Z', 16],
['2021-01-02T00:00:00.000Z', 16],
['2021-01-03T00:00:00.000Z', 16]
["2021-01-01T00:00:00.000Z", 16],
["2021-01-02T00:00:00.000Z", 16],
["2021-01-03T00:00:00.000Z", 16],
];
const energyTS = new TimeSerie('energy', energyData, { deviceId: 'd1' });
const powerTS = new TimeSerie('power', powerData, { deviceId: 'd2' });
const energyTS = new TimeSerie("energy", energyData, { deviceId: "d1" });
const powerTS = new TimeSerie("power", powerData, { deviceId: "d2" });
const tf = TimeFrame.fromTimeseries([energyTS, powerTS]);
const row = tf.atTime('2021-01-01T00:00:00.000Z');
const row = tf.atTime("2021-01-01T00:00:00.000Z");
t.is(row.energy, 4);
t.is(row.power, 16);
// We ensure that metadata is propagated to each timeserie
t.is(tf.metadata?.energy?.deviceId, 'd1');
t.is(tf.metadata?.power?.deviceId, 'd2');
t.is(tf.metadata?.energy?.deviceId, "d1");
t.is(tf.metadata?.power?.deviceId, "d2");
});
test('TimeFrame.filter() should return the correct timeframe', (t) => {
test("TimeFrame.filter() should return the correct timeframe", (t) => {
const data = [
{ time: '2021-01-01', energy: 1, power: 4 },
{ time: '2021-01-01', energy: 1, power: 5 },
{ time: '2021-01-02', energy: 2, power: 8 }
{ time: "2021-01-01", energy: 1, power: 4 },
{ time: "2021-01-01", energy: 1, power: 5 },
{ time: "2021-01-02", energy: 2, power: 8 },
];
const tf = new TimeFrame({ data });
const filtered = tf.filter(row => { return row.power > 4; });
const filtered = tf.filter((row) => {
return row.power > 4;
});
t.is(filtered.length(), 2);
});
test('TimeFrame.join() should return the correct timeframe', (t) => {
const data1 = [
{ time: '2021-01-01', energy: 1, power: 4 }
test("TimeFrame.join() should return the correct timeframe", (t) => {
const data1 = [{ time: "2021-01-01", energy: 1, power: 4, voltage1: 7 }];
const data2 = [
{ time: "2021-01-02", energy: 1, power: 5, voltage2: 4 },
{ time: "2021-01-03", energy: 2, power: 8, voltage3: 5 },
];
const data3 = [
{ time: "2021-01-01", cosphi: 1 },
{ time: "2021-01-04", energy: 2, power: 2, cosphi: 1 },
];
const tf1 = new TimeFrame({ data: data1 });
const tf2 = new TimeFrame({ data: data2 });
const tf3 = new TimeFrame({ data: data3 });
// We want join to be not be dependant to the ordering of timeframes
const joined1 = tf1.join([tf2, tf3]);
const joined2 = tf2.join([tf1, tf3]);
const joined3 = tf3.join([tf1, tf2]);
[joined1, joined2, joined3].forEach((joined) => {
t.is(joined.length(), 4);
t.is(joined.atTime("2021-01-01T00:00:00.000Z").energy, 1);
t.is(joined.atTime("2021-01-01T00:00:00.000Z").power, 4);
t.is(joined.atTime("2021-01-01T00:00:00.000Z").voltage1, 7);
t.is(joined.atTime("2021-01-01T00:00:00.000Z").voltage2, undefined);
t.is(joined.atTime("2021-01-01T00:00:00.000Z").voltage3, undefined);
t.is(joined.atTime("2021-01-02T00:00:00.000Z").energy, 1);
t.is(joined.atTime("2021-01-02T00:00:00.000Z").power, 5);
t.is(joined.atTime("2021-01-02T00:00:00.000Z").voltage1, undefined);
t.is(joined.atTime("2021-01-02T00:00:00.000Z").voltage2, 4);
t.is(joined.atTime("2021-01-02T00:00:00.000Z").voltage3, undefined);
});
});
test("TimeFrame.merge() should return the correct timeframe", (t) => {
const data1 = [{ time: "2021-01-01", energy: 1, power: 4, voltage1: 7 }];
const data2 = [
{ time: '2021-01-02', energy: 1, power: 5 },
{ time: '2021-01-03', energy: 2, power: 8 }
{ time: "2021-01-02", energy: 1, power: 5, voltage2: 4 },
{ time: "2021-01-03", energy: 2, power: 8, voltage3: 5 },
];
const data3 = [
{ time: "2021-01-01", cosphi: 1, energy: 41 },
{ time: "2021-01-02", power: 11 },
{ time: "2021-01-04", energy: 2, power: 2, cosphi: 1 },
];
const tf1 = new TimeFrame({ data: data1 });
const tf2 = new TimeFrame({ data: data2 });
const joined = tf1.join([tf2]);
t.is(joined.length(), 3);
const tf3 = new TimeFrame({ data: data3 });
// We want join to be not be dependant to the ordering of timeframes
const merged = TimeFrame.merge([tf3, tf2, tf1]);
t.is(merged.length(), 4);
t.is(merged.atTime("2021-01-01T00:00:00.000Z").energy, 41);
t.is(merged.atTime("2021-01-01T00:00:00.000Z").cosphi, 1);
t.is(merged.atTime("2021-01-01T00:00:00.000Z").power, 4);
t.is(merged.atTime("2021-01-01T00:00:00.000Z").voltage1, 7);
t.is(merged.atTime("2021-01-02T00:00:00.000Z").energy, 1);
t.is(merged.atTime("2021-01-02T00:00:00.000Z").power, 11);
t.is(merged.atTime("2021-01-02T00:00:00.000Z").voltage2, 4);
t.is(merged.atTime("2021-01-03T00:00:00.000Z").energy, 2);
t.is(merged.atTime("2021-01-03T00:00:00.000Z").power, 8);
t.is(merged.atTime("2021-01-03T00:00:00.000Z").voltage3, 5);
});
test('TimeFrame.apply() should correctly modify columns', (t) => {
test("TimeFrame.apply() should correctly modify columns", (t) => {
const energyData = [
['2021-01-01T00:00:00.000Z', 4],
['2021-01-02T00:00:00.000Z', 4],
['2021-01-03T00:00:00.000Z', 4]
["2021-01-01T00:00:00.000Z", 4],
["2021-01-02T00:00:00.000Z", 4],
["2021-01-03T00:00:00.000Z", 4],
];
const powerData = [
['2021-01-01T00:00:00.000Z', 16],
['2021-01-02T00:00:00.000Z', 16],
['2021-01-03T00:00:00.000Z', 16]
["2021-01-01T00:00:00.000Z", 16],
["2021-01-02T00:00:00.000Z", 16],
["2021-01-03T00:00:00.000Z", 16],
];
const energyTS = new TimeSerie('energy', energyData, { deviceId: 'd1' });
const powerTS = new TimeSerie('power', powerData, { deviceId: 'd2' });
const energyTS = new TimeSerie("energy", energyData, { deviceId: "d1" });
const powerTS = new TimeSerie("power", powerData, { deviceId: "d2" });
const tf = TimeFrame.fromTimeseries([energyTS, powerTS]);
const tf2 = tf.apply(ts => ts.map((p) => [p[0], 0]), ['power']);
t.is(tf.column('energy').sum()[1], 12);
t.is(tf2.column('power').sum()[1], 0);
t.is(tf2.metadata.energy.deviceId, 'd1');
t.is(tf2.metadata.power.deviceId, 'd2');
const tf2 = tf.apply((ts) => ts.map((p) => [p[0], 0]), ["power"]);
t.is(tf.column("energy").sum()[1], 12);
t.is(tf2.column("power").sum()[1], 0);
t.is(tf2.metadata.energy.deviceId, "d1");
t.is(tf2.metadata.power.deviceId, "d2");
});
test('TimeFrame.resample(sum) should correctly resample and aggregate data', t => {
test("TimeFrame.resample(sum) should correctly resample and aggregate data", (t) => {
const data = [
{ time: '2021-01-01T00:00:00.000Z', energy: 1, power: 1 },
{ time: '2021-01-01T00:01:00.000Z', energy: 1, power: 1 },
{ time: '2021-01-01T00:59:00.000Z', energy: 1, power: 1 },
{ time: '2021-01-01T01:01:00.000Z', energy: 1, power: 1 },
{ time: '2021-01-01T01:59:00.000Z', energy: 1, power: 1 },
{ time: '2021-01-01T02:00:00.000Z', energy: 1, power: 1 },
{ time: '2021-01-01T02:01:00.000Z', energy: 1, power: 1 },
{ time: '2021-01-01T02:59:00.000Z', energy: 1, power: 1 },
{ time: '2021-01-01T03:01:00.000Z', energy: 1, power: 1 }
{ time: "2021-01-01T00:00:00.000Z", energy: 1, power: 1 },
{ time: "2021-01-01T00:01:00.000Z", energy: 1, power: 1 },
{ time: "2021-01-01T00:59:00.000Z", energy: 1, power: 1 },
{ time: "2021-01-01T01:01:00.000Z", energy: 1, power: 1 },
{ time: "2021-01-01T01:59:00.000Z", energy: 1, power: 1 },
{ time: "2021-01-01T02:00:00.000Z", energy: 1, power: 1 },
{ time: "2021-01-01T02:01:00.000Z", energy: 1, power: 1 },
{ time: "2021-01-01T02:59:00.000Z", energy: 1, power: 1 },
{ time: "2021-01-01T03:01:00.000Z", energy: 1, power: 1 },
];
const tf = new TimeFrame({ data, metadata: { hello: 'world' } });
const tf = new TimeFrame({ data, metadata: { hello: "world" } });
const resampled = tf.resample({
interval: 1000 * 60 * 60,
from: '2021-01-01T00:00:00.000Z',
to: '2021-01-01T04:00:00.000Z',
operation: 'sum'
from: "2021-01-01T00:00:00.000Z",
to: "2021-01-01T04:00:00.000Z",
operation: "sum",
});
t.is(resampled.length(), 4);
t.is(resampled.rows()[0].time, '2021-01-01T00:00:00.000Z');
t.is(resampled.rows()[0].time, "2021-01-01T00:00:00.000Z");
t.is(resampled.rows()[0].power, 3);
t.is(resampled.rows()[0].energy, 3);
t.is(resampled.rows()[1].time, '2021-01-01T01:00:00.000Z');
t.is(resampled.rows()[1].time, "2021-01-01T01:00:00.000Z");
t.is(resampled.rows()[1].power, 2);
t.is(resampled.rows()[1].energy, 2);
t.is(resampled.rows()[2].time, '2021-01-01T02:00:00.000Z');
t.is(resampled.rows()[2].time, "2021-01-01T02:00:00.000Z");
t.is(resampled.rows()[2].power, 3);
t.is(resampled.rows()[2].energy, 3);
t.is(resampled.rows()[3].time, '2021-01-01T03:00:00.000Z');
t.is(resampled.rows()[3].time, "2021-01-01T03:00:00.000Z");
t.is(resampled.rows()[3].power, 1);
t.is(resampled.rows()[3].energy, 1);
t.is(resampled.metadata.hello, 'world');
t.is(resampled.metadata.hello, "world");
});
test('TimeFrame.sum() should correctly sum all columns', t => {
test("TimeFrame.sum() should correctly sum all columns", (t) => {
const data = [
{ time: '2021-01-01T00:00:00.000Z', energy: 1, power: 4 },
{ time: '2021-01-02T00:00:00.000Z', energy: 1, power: 3 },
{ time: '2021-01-03T00:00:00.000Z', energy: 2, power: 2 },
{ time: '2021-01-04T00:00:00.000Z', energy: 1, power: 9 }
{ time: "2021-01-01T00:00:00.000Z", energy: 1, power: 4 },
{ time: "2021-01-02T00:00:00.000Z", energy: 1, power: 3 },
{ time: "2021-01-03T00:00:00.000Z", energy: 2, power: 2 },
{ time: "2021-01-04T00:00:00.000Z", energy: 1, power: 9 },
];
const row = new TimeFrame({ data }).sum();
t.is(row.time, '2021-01-01T00:00:00.000Z');
t.is(row.time, "2021-01-01T00:00:00.000Z");
t.is(row.energy, 5);
t.is(row.power, 18);
});
test('TimeFrame.delta() should correctly delta all columns', t => {
test("TimeFrame.delta() should correctly delta all columns", (t) => {
const data = [
{ time: '2021-01-01T00:00:00.000Z', energy: 1, expenergy: 4 },
{ time: '2021-01-02T00:00:00.000Z', energy: 2, expenergy: 8 },
{ time: '2021-01-03T00:00:00.000Z', energy: 3, expenergy: 12 },
{ time: '2021-01-04T00:00:00.000Z', energy: 4, expenergy: 16 }
{ time: "2021-01-01T00:00:00.000Z", energy: 1, expenergy: 4 },
{ time: "2021-01-02T00:00:00.000Z", energy: 2, expenergy: 8 },
{ time: "2021-01-03T00:00:00.000Z", energy: 3, expenergy: 12 },
{ time: "2021-01-04T00:00:00.000Z", energy: 4, expenergy: 16 },
];
const row = new TimeFrame({ data }).delta();
t.is(row.time, '2021-01-01T00:00:00.000Z');
t.is(row.time, "2021-01-01T00:00:00.000Z");
t.is(row.energy, 3);
t.is(row.expenergy, 12);
});
test('TimeFrame.max() should correctly max() all columns', t => {
test("TimeFrame.max() should correctly max() all columns", (t) => {
const data = [
{ time: '2021-01-01T00:00:00.000Z', energy: 1, power: 4 },
{ time: '2021-01-02T00:00:00.000Z', energy: 7, power: 3 },
{ time: '2021-01-03T00:00:00.000Z', energy: 2, power: 2 },
{ time: '2021-01-04T00:00:00.000Z', energy: 1, power: 9 }
{ time: "2021-01-01T00:00:00.000Z", energy: 1, power: 4 },
{ time: "2021-01-02T00:00:00.000Z", energy: 7, power: 3 },
{ time: "2021-01-03T00:00:00.000Z", energy: 2, power: 2 },
{ time: "2021-01-04T00:00:00.000Z", energy: 1, power: 9 },
];
const row = new TimeFrame({ data }).max();
t.is(row.time, '2021-01-01T00:00:00.000Z');
t.is(row.time, "2021-01-01T00:00:00.000Z");
t.is(row.energy, 7);
t.is(row.power, 9);
});
test('TimeFrame.min() should correctly min() all columns', t => {
test("TimeFrame.min() should correctly min() all columns", (t) => {
const data = [
{ time: '2021-01-01T00:00:00.000Z', energy: 3, power: 1 },
{ time: '2021-01-02T00:00:00.000Z', energy: 7, power: 3 },
{ time: '2021-01-03T00:00:00.000Z', energy: 2, power: 2 },
{ time: '2021-01-04T00:00:00.000Z', energy: 1, power: 9 }
{ time: "2021-01-01T00:00:00.000Z", energy: 3, power: 1 },
{ time: "2021-01-02T00:00:00.000Z", energy: 7, power: 3 },
{ time: "2021-01-03T00:00:00.000Z", energy: 2, power: 2 },
{ time: "2021-01-04T00:00:00.000Z", energy: 1, power: 9 },
];
const row = new TimeFrame({ data }).min();
t.is(row.time, '2021-01-01T00:00:00.000Z');
t.is(row.time, "2021-01-01T00:00:00.000Z");
t.is(row.energy, 1);
t.is(row.power, 1);
});
test('TimeFrame.avg() should correctly avg() all columns', t => {
test("TimeFrame.avg() should correctly avg() all columns", (t) => {
const data = [
{ time: '2021-01-01T00:00:00.000Z', energy: 4, power: 1 },
{ time: '2021-01-02T00:00:00.000Z', energy: 4, power: 1 },
{ time: '2021-01-03T00:00:00.000Z', energy: 8, power: 11 },
{ time: '2021-01-04T00:00:00.000Z', energy: 8, power: 11 }
{ time: "2021-01-01T00:00:00.000Z", energy: 4, power: 1 },
{ time: "2021-01-02T00:00:00.000Z", energy: 4, power: 1 },
{ time: "2021-01-03T00:00:00.000Z", energy: 8, power: 11 },
{ time: "2021-01-04T00:00:00.000Z", energy: 8, power: 11 },
];
const row = new TimeFrame({ data }).avg();
t.is(row.time, '2021-01-01T00:00:00.000Z');
t.is(row.time, "2021-01-01T00:00:00.000Z");
t.is(row.energy, 6);
t.is(row.power, 6);
});
test('TimeFrame.aggregate() should correctly aggregate columns', t => {
test("TimeFrame.aggregate() should correctly aggregate columns", (t) => {
const data = [
{ time: '2021-01-01T00:00:00.000Z', energy1: 1, energy2: 4 },
{ time: '2021-01-02T00:00:00.000Z', energy1: 2, energy2: 8 },
{ time: '2021-01-03T00:00:00.000Z', energy1: 3, energy2: 12 },
{ time: '2021-01-04T00:00:00.000Z', energy1: 4, energy2: 16 }
{ time: "2021-01-01T00:00:00.000Z", energy1: 1, energy2: 4 },
{ time: "2021-01-02T00:00:00.000Z", energy1: 2, energy2: 8 },
{ time: "2021-01-03T00:00:00.000Z", energy1: 3, energy2: 12 },
{ time: "2021-01-04T00:00:00.000Z", energy1: 4, energy2: 16 },
];
const agg = new TimeFrame({ data, metadata: { hello: 'world' } })
.aggregate({ output: 'totalenergy', columns: ['energy1', 'energy2'], operation: 'add' });
const agg = new TimeFrame({ data, metadata: { hello: "world" } }).aggregate({
output: "totalenergy",
columns: ["energy1", "energy2"],
operation: "add",
});
t.is(agg.atIndex(0).totalenergy, 5);

@@ -256,54 +324,57 @@ t.is(agg.atIndex(1).totalenergy, 10);

t.is(agg.atIndex(3).totalenergy, 20);
t.is(agg.metadata.hello, 'world');
t.is(agg.metadata.hello, "world");
});
test('TimeFrame.project() should correctly aggregate columns', t => {
test("TimeFrame.project() should correctly aggregate columns", (t) => {
const data = [
{ time: '2021-01-01T00:00:00.000Z', energy1: 1, energy2: 4 },
{ time: '2021-01-02T00:00:00.000Z', energy1: 2, energy2: 8 },
{ time: '2021-01-03T00:00:00.000Z', energy1: 3, energy2: 12 },
{ time: '2021-01-04T00:00:00.000Z', energy1: 4, energy2: 16 }
{ time: "2021-01-01T00:00:00.000Z", energy1: 1, energy2: 4 },
{ time: "2021-01-02T00:00:00.000Z", energy1: 2, energy2: 8 },
{ time: "2021-01-03T00:00:00.000Z", energy1: 3, energy2: 12 },
{ time: "2021-01-04T00:00:00.000Z", energy1: 4, energy2: 16 },
];
const tf = new TimeFrame({ data, metadata: { hello: 'world' } });
const projected = tf.project({ columns: ['energy1'] });
const tf = new TimeFrame({ data, metadata: { hello: "world" } });
const projected = tf.project({ columns: ["energy1"] });
t.is(tf.columns().length, 2);
t.is(projected.columns().length, 1);
t.is(projected.metadata.hello, 'world');
t.is(projected.metadata.hello, "world");
});
test('TimeFrame.mul() should correctly multiply values', t => {
test("TimeFrame.mul() should correctly multiply values", (t) => {
const data = [
{ time: '2021-01-01T00:00:00.000Z', energy1: 1, energy2: 4 },
{ time: '2021-01-02T00:00:00.000Z', energy1: 2, energy2: 8 },
{ time: '2021-01-03T00:00:00.000Z', energy1: 3, energy2: 12 },
{ time: '2021-01-04T00:00:00.000Z', energy1: 4, energy2: 16 }
{ time: "2021-01-01T00:00:00.000Z", energy1: 1, energy2: 4 },
{ time: "2021-01-02T00:00:00.000Z", energy1: 2, energy2: 8 },
{ time: "2021-01-03T00:00:00.000Z", energy1: 3, energy2: 12 },
{ time: "2021-01-04T00:00:00.000Z", energy1: 4, energy2: 16 },
];
const tf = new TimeFrame({ data, metadata: { hello: 'world' } });
const tf = new TimeFrame({ data, metadata: { hello: "world" } });
const multiplied = tf.mul(2);
t.is(multiplied.atTime('2021-01-01T00:00:00.000Z').energy1, 2);
t.is(multiplied.atTime('2021-01-01T00:00:00.000Z').energy2, 8);
t.is(multiplied.atTime('2021-01-02T00:00:00.000Z').energy1, 4);
t.is(multiplied.atTime('2021-01-02T00:00:00.000Z').energy2, 16);
t.is(multiplied.atTime("2021-01-01T00:00:00.000Z").energy1, 2);
t.is(multiplied.atTime("2021-01-01T00:00:00.000Z").energy2, 8);
t.is(multiplied.atTime("2021-01-02T00:00:00.000Z").energy1, 4);
t.is(multiplied.atTime("2021-01-02T00:00:00.000Z").energy2, 16);
});
test('TimeFrame.add() should correctly add values', t => {
test("TimeFrame.add() should correctly add values", (t) => {
const data = [
{ time: '2021-01-01T00:00:00.000Z', energy1: 1, energy2: 4 },
{ time: '2021-01-02T00:00:00.000Z', energy1: 2, energy2: 8 },
{ time: '2021-01-03T00:00:00.000Z', energy1: 3, energy2: 12 },
{ time: '2021-01-04T00:00:00.000Z', energy1: 4, energy2: 16 }
{ time: "2021-01-01T00:00:00.000Z", energy1: 1, energy2: 4 },
{ time: "2021-01-02T00:00:00.000Z", energy1: 2, energy2: 8 },
{ time: "2021-01-03T00:00:00.000Z", energy1: 3, energy2: 12 },
{ time: "2021-01-04T00:00:00.000Z", energy1: 4, energy2: 16 },
];
const tf = new TimeFrame({ data, metadata: { hello: 'world' } });
const tf = new TimeFrame({ data, metadata: { hello: "world" } });
const added = tf.add(2);
t.is(added.atTime('2021-01-01T00:00:00.000Z').energy1, 3);
t.is(added.atTime('2021-01-01T00:00:00.000Z').energy2, 6);
t.is(added.atTime('2021-01-02T00:00:00.000Z').energy1, 4);
t.is(added.atTime('2021-01-02T00:00:00.000Z').energy2, 10);
t.is(added.atTime("2021-01-01T00:00:00.000Z").energy1, 3);
t.is(added.atTime("2021-01-01T00:00:00.000Z").energy2, 6);
t.is(added.atTime("2021-01-02T00:00:00.000Z").energy1, 4);
t.is(added.atTime("2021-01-02T00:00:00.000Z").energy2, 10);
});
test('TimeFrame.reduce() should correctly reduce the timeframe', t => {
test("TimeFrame.reduce() should correctly reduce the timeframe", (t) => {
const data = [
{ time: '2021-01-01T00:00:00.000Z', energy: 1, power: 4 },
{ time: '2021-01-02T00:00:00.000Z', energy: 1, power: 4 },
{ time: '2021-01-03T00:00:00.000Z', energy: 1, power: 2 },
{ time: '2021-01-04T00:00:00.000Z', energy: 1, power: 2 }
{ time: "2021-01-01T00:00:00.000Z", energy: 1, power: 4 },
{ time: "2021-01-02T00:00:00.000Z", energy: 1, power: 4 },
{ time: "2021-01-03T00:00:00.000Z", energy: 1, power: 2 },
{ time: "2021-01-04T00:00:00.000Z", energy: 1, power: 2 },
];
const tf = new TimeFrame({ data });
const reduced = tf.reduce({ operation: 'avg', operations: { energy: 'sum' } });
const reduced = tf.reduce({
operation: "avg",
operations: { energy: "sum" },
});
const rows = reduced.rows();

@@ -314,28 +385,223 @@ t.is(rows.length, 1);

});
test('TimeFrame.pipeline() should correctly run all the stages', t => {
test("TimeFrame.pipeline() should correctly run all the stages", (t) => {
const data = [
{ time: '2021-01-01T00:00:00.000Z', voltage1: 1, current1: 1, voltage2: 2, current2: 2, voltage3: 3, current3: 3 },
{ time: '2021-01-01T00:01:00.000Z', voltage1: 1, current1: 1, voltage2: 2, current2: 2, voltage3: 3, current3: 3 },
{ time: '2021-01-01T00:59:00.000Z', voltage1: 1, current1: 1, voltage2: 2, current2: 2, voltage3: 3, current3: 3 },
{ time: '2021-01-01T01:01:00.000Z', voltage1: 1, current1: 1, voltage2: 2, current2: 2, voltage3: 3, current3: 3 },
{ time: '2021-01-01T01:59:00.000Z', voltage1: 1, current1: 1, voltage2: 2, current2: 2, voltage3: 3, current3: 3 },
{ time: '2021-01-01T02:00:00.000Z', voltage1: 1, current1: 1, voltage2: 2, current2: 2, voltage3: 3, current3: 3 },
{ time: '2021-01-01T02:01:00.000Z', voltage1: 1, current1: 1, voltage2: 2, current2: 2, voltage3: 3, current3: 3 },
{ time: '2021-01-01T02:59:00.000Z', voltage1: 1, current1: 1, voltage2: 2, current2: 2, voltage3: 3, current3: 3 },
{ time: '2021-01-01T03:01:00.000Z', voltage1: 1, current1: 1, voltage2: 2, current2: 2, voltage3: 3, current3: 3 }
{
time: "2021-01-01T00:00:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T00:01:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T00:59:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T01:01:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T01:59:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T02:00:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T02:01:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T02:59:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T03:01:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
];
const tf = new TimeFrame({ data, metadata: { hello: 'world' } });
const tf = new TimeFrame({ data, metadata: { hello: "world" } });
const processed = tf.pipeline([
{ aggregate: { columns: ['voltage1', 'current1'], operation: 'mul', output: 'power1' } },
{ aggregate: { columns: ['voltage2', 'current2'], operation: 'mul', output: 'power2' } },
{ aggregate: { columns: ['voltage3', 'current3'], operation: 'mul', output: 'power3' } },
{ aggregate: { columns: ['power1', 'power2', 'power3'], operation: 'add', output: 'powertot' } },
{ project: { columns: ['powertot'] } },
{ resample: { interval: 1000 * 60 * 60, operation: 'avg', from: '2021-01-01T00:00:00.000Z' } }
{
aggregate: {
columns: ["voltage1", "current1"],
operation: "mul",
output: "power1",
},
},
{
aggregate: {
columns: ["voltage2", "current2"],
operation: "mul",
output: "power2",
},
},
{
aggregate: {
columns: ["voltage3", "current3"],
operation: "mul",
output: "power3",
},
},
{
aggregate: {
columns: ["power1", "power2", "power3"],
operation: "add",
output: "powertot",
},
},
{ project: { columns: ["powertot"] } },
{
resample: {
interval: 1000 * 60 * 60,
operation: "avg",
from: "2021-01-01T00:00:00.000Z",
},
},
]);
t.is(processed.length(), 4);
t.is(processed.columnNames.length, 1);
t.is(processed.columnNames[0], 'powertot');
t.is(processed.metadata.hello, 'world');
t.is(processed.columnNames[0], "powertot");
t.is(processed.metadata.hello, "world");
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWZyYW1lLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RpbWVmcmFtZS5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLEtBQUssQ0FBQTtBQUV0QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3ZDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFHdkMsSUFBSSxDQUFDLHdEQUF3RCxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDbkUsTUFBTSxJQUFJLEdBQUc7UUFDWCxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1FBQzNDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7S0FDNUMsQ0FBQTtJQUNELE1BQU0sRUFBRSxHQUFHLElBQUksU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUVsQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRWxDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sWUFBWSxTQUFTLENBQUMsQ0FBQTtJQUN2QyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtJQUN4QixDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDcEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBQ3RDLENBQUMsQ0FBQyxDQUFBO0FBRUYsSUFBSSxDQUFDLG9EQUFvRCxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDL0QsTUFBTSxJQUFJLEdBQUc7UUFDWCxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1FBQzNDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7UUFDM0MsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtLQUM1QyxDQUFBO0lBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBRWxDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBQ3RCLENBQUMsQ0FBQyxDQUFBO0FBQ0YsSUFBSSxDQUFDLG1EQUFtRCxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDOUQsTUFBTSxJQUFJLEdBQUc7UUFDWCxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1FBQzNDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7UUFDM0MsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtLQUM1QyxDQUFBO0lBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ2xDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDakMsQ0FBQyxDQUFDLENBQUE7QUFFRixJQUFJLENBQUMscURBQXFELEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUNoRSxNQUFNLElBQUksR0FBRztRQUNYLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7UUFDM0MsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtRQUMzQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO0tBQzVDLENBQUE7SUFDRCxNQUFNLEVBQUUsR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7SUFDbEMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUE7QUFDdkUsQ0FBQyxDQUFDLENBQUE7QUFFRixJQUFJLENBQUMsa0RBQWtELEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUM3RCxNQUFNLElBQUksR0FBRztRQUNYLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7UUFDM0MsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtLQUM1QyxDQUFBO0lBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBRWxDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7SUFFbkMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ25CLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQTtB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QUFDLENBQUE7SUFFckMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDeEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7QUFDekMsQ0FBQyxDQUFDLENBQUE7QUFFRixJQUFJLENBQUMsc0VBQXNFLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDL0UsTUFBTSxJQUFJLEdBQUc7UUFDWCxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7UUFDekQsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1FBQ3pELEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtRQUN6RCxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7UUFDekQsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1FBQ3pELEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtRQUN6RCxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7UUFDekQsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1FBQ3pELEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFF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RUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1FBQ3pELEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtLQUMxRCxDQUFBO0lBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFBO0lBRXpDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSwwQkFBMEIsQ0FBQyxDQUFBO0lBQzFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUNuQixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7QUFDckIsQ0FBQyxDQUFDLENBQUE7QUFFRixJQUFJLENBQUMsc0RBQXNELEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDL0QsTUFBTSxJQUFJLEdBQUc7UUFDWCxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUU7UUFDN0QsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFO1FBQzdELEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtRQUM5RCxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7S0FDL0QsQ0FBQTtJQUNELE1BQU0sR0FBRyxHQUFHLElBQUksU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUUzQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsMEJBQTBCLENBQUMsQ0FBQTtJQUMxQyxD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QyxDQUFDLENBQUE7SUFDcEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3ZCLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUN4QixDQUFDLENBQUMsQ0FBQTtBQUVGLElBQUksQ0FBQywwREFBMEQsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUNuRSxNQUFNLElBQUksR0FBRztRQUNYLEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFO1FBQ2xILEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFO1FBQ2xILEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFO1FBQ2xILEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFO1FBQ2xILEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFO1FBQ2xILEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFO1FBQ2xILEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFO1FBQ2xILEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFO1FBQ2xILEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFO0tBQ25ILENBQUE7SUFDRCxNQUFNLEVBQUUsR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBRWhFLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFDNUIsRUFBRSxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQUU7UUFDeEYsRUFBRSxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQUU7UUFDeEYsRUFBRSxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQUU7UUFDeEYsRUFBRSxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxFQUFFO1FBQ2hHLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRTtRQUN0QyxFQUFFLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxFQUFFO0tBQy9GLENBQUMsQ0FBQTtJQUVGLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQzNCLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDckMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBRTFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUE7QUFDekMsQ0FBQyxDQUFDLENBQUEifQ==
test("TimeFrame.split() should split a timeframe into sub timeframes of fixed size", (t) => {
const data = [
{
time: "2021-01-01T00:00:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T00:01:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T00:59:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T01:01:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T01:59:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T02:00:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T02:01:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T02:59:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
{
time: "2021-01-01T03:01:00.000Z",
voltage1: 1,
current1: 1,
voltage2: 2,
current2: 2,
voltage3: 3,
current3: 3,
},
];
const tf = new TimeFrame({ data, metadata: { hello: "world" } });
const chunks = tf.split({ chunks: 3 });
t.is(chunks.length, 3);
t.deepEqual(chunks.map((tf) => tf.shape()), [
[3, 6],
[3, 6],
[3, 6],
]);
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWZyYW1lLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RpbWVmcmFtZS5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLEtBQUssQ0FBQztBQUV2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFeEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRTNDLElBQUksQ0FBQyx3REFBd0QsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQ25FLE1BQU0sSUFBSSxHQUFHO1FBQ1gsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtRQUMzQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO0tBQzVDLENBQUM7SUFDRixNQUFNLEVBQUUsR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFFbkMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVuQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLFlBQVksU0FBUyxDQUFDLENBQUM7SUFDeEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDekIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN2QyxDQUFDLENBQUMsQ0FBQztBQUVILElBQUksQ0FBQyxvREFBb0QsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQy9ELE1BQU0sSUFBSSxHQUFHO1FBQ1gsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtRQUMzQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1FBQzNDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7S0FDNUMsQ0FBQztJQUNGLE1BQU0sRUFBRSxHQUFHLElBQUksU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUVuQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN2QixDQUFDLENBQUMsQ0FBQztBQUNILElBQUksQ0FBQyxtREFBbUQsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQzlELE1BQU0sSUFBSSxHQUFHO1FBQ1gsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtRQUMzQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1FBQzNDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7S0FDNUMsQ0FBQztJQUNGLE1BQU0sRUFBRSxHQUFHLElBQUksU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNuQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xD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LEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNwRSxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pELENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNwRSxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3RFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsdURBQXVELEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUNsRSxNQUFNLEtBQUssR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDekUsTUFBTSxLQUFLLEdBQUc7UUFDWixFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUU7UUFDeEQsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFO0tBQ3pELENBQUM7SUFDRixNQUFNLEtBQUssR0FBRztRQUNaLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7UUFDN0MsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7UUFDakMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFO0tBQ3ZELENBQUM7SUFDRixNQUFNLEdBQUcsR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sR0FBRyxHQUFHLElBQUksU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDM0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUUzQyxvRUFBb0U7SUFDcEUsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNoRCxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6QixDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDM0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFNUQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMxRCxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFNUQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDOUQsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsbURBQW1ELEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUM5RCxNQUFNLFVBQVUsR0FBWTtRQUMxQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztLQUNoQyxDQUFDO0lBQ0YsTUFBTSxTQUFTLEdBQVk7UUFDekIsQ0FBQywwQkFBMEIsRUFBRSxFQUFFLENBQUM7UUFDaEMsQ0FBQywwQkFBMEIsRUFBRSxFQUFFLENBQUM7UUFDaEMsQ0FBQywwQkFBMEIsRUFBRSxFQUFFLENBQUM7S0FDakMsQ0FBQztJQUNGLE1BQU0sUUFBUSxHQUFHLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN6RSxNQUFNLE9BQU8sR0FBRyxJQUFJLFNBQVMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFFdEUsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRXpELE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRXpFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN2QyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFdEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDMUMsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsc0VBQXNFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUNqRixNQUFNLElBQUksR0FBRztRQUNYLEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtRQUN6RCxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7UUFDekQsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1FBQ3pELEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtRQUN6RCxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7UUFDekQsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1FBQ3pELEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtRQUN6RCxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7UUFDekQsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO0tBQzFELENBQUM7SUFDRixNQUFNLEVBQUUsR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUs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LEVBQUU7S0FDMUQsQ0FBQztJQUNGLE1BQU0sR0FBRyxHQUFHLElBQUksU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUUxQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3RCLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBSSxDQUFDLHNEQUFzRCxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDakUsTUFBTSxJQUFJLEdBQUc7UUFDWCxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUU7UUFDN0QsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFO1FBQzdELEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtRQUM5RCxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7S0FDL0QsQ0FBQztJQUNGLE1BQU0sR0FBRyxHQUFHLElBQUksU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUU1QyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENB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QUUsQ0FBQyxDQUFDLENBQUM7SUFFL0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNsRSxDQUFDLENBQUMsQ0FBQztBQUVILElBQUksQ0FBQyw2Q0FBNkMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQ3hELE1BQU0sSUFBSSxHQUFHO1FBQ1gsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFO1FBQzVELEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRTtRQUM1RCxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7UUFDN0QsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFO0tBQzlELENBQUM7SUFDRixNQUFNLEVBQUUsR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFeEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUUxRCxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzdELENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBSSxDQUFDLDBEQUEwRCxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDckUsTUFBTSxJQUFJLEdBQUc7UUFDWCxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7UUFDekQsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1FBQ3pELEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtRQUN6RCxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7S0FDMUQsQ0FBQztJQUNGLE1BQU0sRUFBRSxHQUFHLElBQUksU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUVuQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ3hCLFNBQVMsRUFBRSxLQUFLO1FBQ2hCLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7S0FDOUIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzVCLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBSSxDQUFDLDBEQUEwRCxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDckUsTUFBTSxJQUFJLEdBQUc7UUFDWDtZQUNFLElBQUksRUFBRSwwQkFBMEI7WUFDaEMsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1NBQ1o7UUFDRDtZQUNFLElBQUksRUFBRSwwQkFBMEI7WUFDaEMsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1NBQ1o7UUFDRDtZQUNFLElBQUksRUFBRSwwQkFBMEI7WUFDaEMsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1NBQ1o7UUFDRDtZQUNFLElBQUksRUFBRSwwQkFBMEI7WUFDaEMsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxDQUFDO1NBQ1o7UUFDRDtZQUNFLElBQUksRUFBRSwwQkFBMEI7WUFDaEMsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEs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

@@ -1,2 +0,2 @@

import { DateLike, FromIndexOptions, Index, Metadata, PartitionOptions, Point, PointValue, ReindexOptions, ResampleOptions, TimeseriePointIterator, TimeSerieReduceOptions, TimeSeriesOperationOptions } from './types';
import { BetweenTimeOptions, DateLike, FromIndexOptions, Index, Metadata, PartitionOptions, Point, PointValue, ReindexOptions, ResampleOptions, SplitOptions, TimeseriePointIterator, TimeSerieReduceOptions, TimeSeriesOperationOptions } from "./types";
/**

@@ -14,6 +14,18 @@ * A data structure for a time serie.

};
/**
* Creates a new timeserie.
* @param name {String} The name of the serie
* @param serie {Point[]} The points in the serie
* @param metadata {Metadata} Optional metadata
*/
constructor(name: string, serie: Point[] | ReadonlyArray<Point>, metadata?: Metadata);
/**
* Creates a new TimeSerie from the given Index. The new serie's values are all set to `null` unless `options.fill` is passed.
* @param index
* @param options
*/
static fromIndex(index: Index, options: FromIndexOptions): TimeSerie;
/**
* Recreates the serie's index
* Recreates the serie's index according to `options` and returns the reindexed serie.
*
* @param index The new index to use. Can be created with createIndex()

@@ -27,5 +39,9 @@ * @see createIndex

*
* @returns Array of points, where each point is a tuple with ISO8601 timestamp and value
* Returns the array of points, where each point is a tuple with ISO8601 timestamp and value
*/
toArray(): Point[];
/**
* Updates (in place) the serie's name. **This method does NOT return a new timeserie**.
* @param name
*/
rename(name: string): this;

@@ -40,3 +56,3 @@ /**

*
* @returns The array of time indexes
* Returns the array of time indexes
*/

@@ -46,3 +62,3 @@ indexes(): DateLike[];

*
* @returns The array of values
* Returns the array of values
*/

@@ -56,3 +72,3 @@ values(): PointValue[];

*
* @returns The time of the latest non-NaN value
* Returns the time of the latest non-NaN value
*/

@@ -62,18 +78,16 @@ lastValidIndex(): string | null;

*
* @returns The time of the first non-NaN value
* Returns the time of the first non-NaN value
*/
firstValidIndex(): string | null;
/**
*
* @returns The latest non-NaN value
* Returns the latest non-NaN value
*/
lastValidValue(): PointValue;
/**
*
* @returns The first non-NaN value
* Returns the first non-NaN value
*/
firstValidValue(): PointValue;
/**
*
* @returns {PointValue} The value of the timeseries at the given time
* Returns the value of the timeseries at the given time
* @returns {PointValue}
*/

@@ -83,37 +97,56 @@ atTime(time: DateLike, fillValue?: number): PointValue;

*
* @returns The value at the given index (position, not time)
* Returns the value at the given index.
*/
atIndex(index: number): PointValue;
/**
* Returns the subset of points between the two dates. Extremes are included.
*
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
* @returns The subset of points between the two dates. Extremes are included.
*/
betweenTime(from: DateLike, to: DateLike, options?: {
includeInferior: boolean;
includeSuperior: boolean;
}): TimeSerie;
betweenTime(from: DateLike, to: DateLike, options?: BetweenTimeOptions): TimeSerie;
/**
*
* @param from start positional index
* @param to end positional index
* @returns The subset of points between the two indexes. Extremes are included.
*/
* Returns the subset of points between the two indexes. Extremes are included.
*
* @param from start positional index
* @param to end positional index
*/
betweenIndexes(from: number, to: number): TimeSerie;
/**
* Builds a new serie by applying a filter function the current serie's points
* @params fn {Function}
*/
filter(fn: TimeseriePointIterator): TimeSerie;
/**
* Builds a new serie by applying a map function the current serie's points
* @param fn {Function}
*/
map(fn: TimeseriePointIterator): TimeSerie;
/**
* Returns the number of points in the serie.
*/
length(): number;
/**
* Returns true if the serie has 0 points
*/
isEmpty(): boolean;
/**
* Copies the serie to a new serie
*/
copy(): TimeSerie;
/**
* Returns the sum of the values in the serie
*/
sum(): Point;
/**
*
* @returns The average of point values
* Returns the average of the values in the serie
*/
avg(): Point;
/**
* Returns the difference between the last and the first element by performing last value - first value.
*/
delta(): Point;
/**
* Returns the first point
*
* @returns The firstfirst point
*/

@@ -124,3 +157,2 @@ first(): Point;

* @param time
* @returns
*/

@@ -130,3 +162,3 @@ firstAt(time: DateLike): Point;

*
* @returns The last point
* Returns the last point
*/

@@ -136,3 +168,3 @@ last(): Point;

*
* @returns The point with max value, or null
* Returns the point with max value, or null
*/

@@ -142,3 +174,3 @@ max(): Point | null;

*
* @returns The point with min value or null
* Returns the point with min value or null
*/

@@ -153,24 +185,39 @@ min(): Point | null;

* @param options
* @returns
*/
partition(options: PartitionOptions): TimeSerie[];
/**
* Splits a timeserie into multiple timeseries where each timeserie has
* a maximum of `options.chunks` points.
*/
split(options: SplitOptions): TimeSerie[];
/**
* Resample the timeserie using a new time interval and a point aggregation function
* @param options
* @returns
*/
resample(options: ResampleOptions): TimeSerie;
/**
* Remove the point at the given time and returns a new serie
*/
removeAt(time: DateLike): TimeSerie;
/**
* Remove the point at the given index and returns a new serie
*/
removeAtIndex(index: number): TimeSerie;
/**
*
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
* @returns New timeserie without the removed data. Bounds are removed.
*/
* Returns the new timeserie without the removed data. Bounds are removed.
*
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
*/
removeBetweenTime(from: DateLike, to: DateLike): TimeSerie;
/**
* Removes points with NaN value from the serie
*/
dropNaN(): TimeSerie;
/**
* Removes points with null value from the serie.
*/
dropNull(): TimeSerie;
/**
*
* Rounds the serie's points.
* @param decimals {Number} the number of decimals to keep

@@ -180,7 +227,33 @@ * @returns {TimeSerie}

round(decimals: number): TimeSerie;
/**
* Combine the current serie with an array of series y performing combination operations, such as multiplication, addition ecc.
* @param operation {string}
* @param series {TimeSerie[]}
* @param options {TimeSeriesOperationOptions}
*/
combine(operation: string, series: TimeSerie[], options?: TimeSeriesOperationOptions): TimeSerie;
/**
* Adds values to the timeserie. If a scalar is passed, its value is added to every point in the serie. If another serie
* is passed, the two series are combined by addition.
* @see combine
*/
add(value: number | TimeSerie): TimeSerie;
/**
* Subtracts values from the timeserie. If a scalar is passed, its value is subtracted from every point in the serie. If another serie
* is passed, the two series are combined by subtraction.
* @see combine
*/
sub(value: number | TimeSerie): TimeSerie;
/**
* Multiplies values of the timeserie. If a scalar is passed, every point in the serie is multiplied times that value. If another serie
* is passed, the two series are combined by multiplication.
* @see combine
*/
mul(value: number | TimeSerie): TimeSerie;
/**
* Divides values of the timeserie. If a scalar is passed, every point in the serie is divided by that value. If another serie
* is passed, the two series are combined by division.
* @see combine
*/
div(value: number | TimeSerie): TimeSerie;
}

@@ -1,13 +0,15 @@

import { createIndex, TimeInterval } from './types';
import { DateLikeToString } from './utils';
import { createIndex, TimeInterval, } from "./types";
import { chunk, DateLikeToString } from "./utils";
import * as Timsort from "timsort";
function isNumeric(str) {
if (typeof str === 'number')
if (typeof str === "number")
return !isNaN(str);
if (typeof str !== 'string')
if (typeof str !== "string")
return false; // we only process strings!
return !isNaN(str) && // use type coercion to parse the _entirety_ of the string (`parseFloat` alone does not do this)...
!isNaN(parseFloat(str)); // ...and ensure strings of whitespace fail
return (!isNaN(str) && // use type coercion to parse the _entirety_ of the string (`parseFloat` alone does not do this)...
!isNaN(parseFloat(str))); // ...and ensure strings of whitespace fail
}
function sortPoints(points) {
return [].concat(points).sort((a, b) => {
const arr = [].concat(points);
Timsort.sort(arr, (a, b) => {
if (a[0] > b[0]) {

@@ -20,2 +22,3 @@ return 1;

});
return arr;
}

@@ -29,2 +32,8 @@ function normalizePoint(p) {

export class TimeSerie {
/**
* Creates a new timeserie.
* @param name {String} The name of the serie
* @param serie {Point[]} The points in the serie
* @param metadata {Metadata} Optional metadata
*/
constructor(name, serie, metadata = {}) {

@@ -34,3 +43,5 @@ this.data = sortPoints(serie).map(normalizePoint);

this.metadata = metadata;
this.index = [].concat(this.data).reduce((acc, p) => {
this.index = []
.concat(this.data)
.reduce((acc, p) => {
acc[p[0]] = p;

@@ -40,7 +51,13 @@ return acc;

}
/**
* Creates a new TimeSerie from the given Index. The new serie's values are all set to `null` unless `options.fill` is passed.
* @param index
* @param options
*/
static fromIndex(index, options) {
return new TimeSerie(options.name, index.map((i) => ([i, options?.fill || null])), options.metadata);
return new TimeSerie(options.name, index.map((i) => [i, options?.fill || null]), options.metadata);
}
/**
* Recreates the serie's index
* Recreates the serie's index according to `options` and returns the reindexed serie.
*
* @param index The new index to use. Can be created with createIndex()

@@ -54,9 +71,9 @@ * @see createIndex

const idx = [...new Set(this.indexes().concat(index))];
return new TimeSerie(this.name, idx.map((i) => ([i, this.atTime(i) || options?.fill || null])), this.metadata);
return new TimeSerie(this.name, idx.map((i) => [i, this.atTime(i) || options?.fill || null]), this.metadata);
}
return new TimeSerie(this.name, index.map((i) => ([i, this.atTime(i) || options?.fill || null])), this.metadata);
return new TimeSerie(this.name, index.map((i) => [i, this.atTime(i) || options?.fill || null]), this.metadata);
}
/**
*
* @returns Array of points, where each point is a tuple with ISO8601 timestamp and value
* Returns the array of points, where each point is a tuple with ISO8601 timestamp and value
*/

@@ -66,2 +83,6 @@ toArray() {

}
/**
* Updates (in place) the serie's name. **This method does NOT return a new timeserie**.
* @param name
*/
rename(name) {

@@ -81,3 +102,3 @@ this.name = name;

*
* @returns The array of time indexes
* Returns the array of time indexes
*/

@@ -89,3 +110,3 @@ indexes() {

*
* @returns The array of values
* Returns the array of values
*/

@@ -99,10 +120,13 @@ values() {

static concat(series) {
return new TimeSerie(series[0].name, series.map(serie => serie.toArray()).flat(), Object.assign({}, ...series.map(serie => serie.metadata)));
return new TimeSerie(series[0].name, series.flatMap((serie) => serie.toArray()), Object.assign({}, ...series.map((serie) => serie.metadata)));
}
/**
*
* @returns The time of the latest non-NaN value
* Returns the time of the latest non-NaN value
*/
lastValidIndex() {
const result = this.data.concat([]).reverse().find((point) => {
const result = this.data
.concat([])
.reverse()
.find((point) => {
return !!point[1];

@@ -119,3 +143,3 @@ });

*
* @returns The time of the first non-NaN value
* Returns the time of the first non-NaN value
*/

@@ -134,7 +158,9 @@ firstValidIndex() {

/**
*
* @returns The latest non-NaN value
* Returns the latest non-NaN value
*/
lastValidValue() {
const result = this.data.concat([]).reverse().find((point) => {
const result = this.data
.concat([])
.reverse()
.find((point) => {
return !!point[1];

@@ -150,4 +176,3 @@ });

/**
*
* @returns The first non-NaN value
* Returns the first non-NaN value
*/

@@ -166,4 +191,4 @@ firstValidValue() {

/**
*
* @returns {PointValue} The value of the timeseries at the given time
* Returns the value of the timeseries at the given time
* @returns {PointValue}
*/

@@ -175,7 +200,7 @@ atTime(time, fillValue = null) {

*
* @returns The value at the given index (position, not time)
* Returns the value at the given index.
*/
atIndex(index) {
if (index >= this.data.length) {
throw new Error('Index out of bounds');
throw new Error("Index out of bounds");
}

@@ -185,8 +210,11 @@ return this.data[index][1];

/**
* Returns the subset of points between the two dates. Extremes are included.
*
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
* @returns The subset of points between the two dates. Extremes are included.
*/
betweenTime(from, to, options = { includeInferior: true, includeSuperior: true }) {
betweenTime(from, to, options = {
includeInferior: true,
includeSuperior: true,
}) {
const { includeInferior, includeSuperior } = options;

@@ -197,12 +225,16 @@ const f = new Date(from);

if (includeInferior && includeSuperior) {
return new Date(point[0]).getTime() >= f.getTime() && new Date(point[0]).getTime() <= t.getTime();
return (new Date(point[0]).getTime() >= f.getTime() &&
new Date(point[0]).getTime() <= t.getTime());
}
else if (includeInferior && !includeSuperior) {
return new Date(point[0]).getTime() >= f.getTime() && new Date(point[0]).getTime() < t.getTime();
return (new Date(point[0]).getTime() >= f.getTime() &&
new Date(point[0]).getTime() < t.getTime());
}
else if (!includeInferior && includeSuperior) {
return new Date(point[0]).getTime() > f.getTime() && new Date(point[0]).getTime() <= t.getTime();
return (new Date(point[0]).getTime() > f.getTime() &&
new Date(point[0]).getTime() <= t.getTime());
}
else {
return new Date(point[0]).getTime() > f.getTime() && new Date(point[0]).getTime() < t.getTime();
return (new Date(point[0]).getTime() > f.getTime() &&
new Date(point[0]).getTime() < t.getTime());
}

@@ -213,25 +245,47 @@ });

/**
*
* @param from start positional index
* @param to end positional index
* @returns The subset of points between the two indexes. Extremes are included.
*/
* Returns the subset of points between the two indexes. Extremes are included.
*
* @param from start positional index
* @param to end positional index
*/
betweenIndexes(from, to) {
return this.filter((_, i) => { return i >= from && i <= to; });
return this.filter((_, i) => {
return i >= from && i <= to;
});
}
/**
* Builds a new serie by applying a filter function the current serie's points
* @params fn {Function}
*/
filter(fn) {
return this.recreate(this.data.filter(fn));
}
/**
* Builds a new serie by applying a map function the current serie's points
* @param fn {Function}
*/
map(fn) {
return this.recreate(this.data.map(fn));
}
/**
* Returns the number of points in the serie.
*/
length() {
return this.data.length;
}
/**
* Returns true if the serie has 0 points
*/
isEmpty() {
return this.data.length === 0;
}
/**
* Copies the serie to a new serie
*/
copy() {
return new TimeSerie(this.name, this.data, this.metadata);
}
/**
* Returns the sum of the values in the serie
*/
sum() {

@@ -242,7 +296,12 @@ if (this.length() === 0) {

const copy = this.dropNaN();
return [this.first()[0], copy.data.map((p) => p[1]).reduce((p1, p2) => p1 + p2, 0)];
let tot = 0;
const l = copy.length();
const data = copy.toArray();
for (let i = l - 1; i >= 0; i--) {
tot += data[i][1];
}
return [this.first()[0], tot];
}
/**
*
* @returns The average of point values
* Returns the average of the values in the serie
*/

@@ -256,2 +315,5 @@ avg() {

}
/**
* Returns the difference between the last and the first element by performing last value - first value.
*/
delta() {

@@ -268,4 +330,4 @@ if (this.length() <= 0) {

/**
* Returns the first point
*
* @returns The firstfirst point
*/

@@ -278,10 +340,11 @@ first() {

* @param time
* @returns
*/
firstAt(time) {
return this.data.find((p) => { return new Date(p[0]).getTime() >= new Date(time).getTime(); });
return this.data.find((p) => {
return new Date(p[0]).getTime() >= new Date(time).getTime();
});
}
/**
*
* @returns The last point
* Returns the last point
*/

@@ -293,3 +356,3 @@ last() {

*
* @returns The point with max value, or null
* Returns the point with max value, or null
*/

@@ -303,7 +366,7 @@ max() {

}
return this.data.reduce((prev, current) => current[1] > prev[1] ? current : prev, this.data[0]);
return this.data.reduce((prev, current) => (current[1] > prev[1] ? current : prev), this.data[0]);
}
/**
*
* @returns The point with min value or null
* Returns the point with min value or null
*/

@@ -317,3 +380,3 @@ min() {

}
return this.data.reduce((prev, current) => current[1] < prev[1] ? current : prev, this.data[0]);
return this.data.reduce((prev, current) => (current[1] < prev[1] ? current : prev), this.data[0]);
}

@@ -329,3 +392,2 @@ /**

* @param options
* @returns
*/

@@ -335,11 +397,14 @@ partition(options) {

if (!from) {
throw new Error('Cannot infer a lower bound for resample');
throw new Error("Cannot infer a lower bound for resample");
}
const to = options.to || this.last()?.[0];
if (!to) {
throw new Error('Cannot infer an upper bound for resample');
throw new Error("Cannot infer an upper bound for resample");
}
const intervals = TimeInterval.generate(from, to, options.interval);
const partitions = intervals.map((interval) => {
return this.betweenTime(interval.from, interval.to, { includeInferior: true, includeSuperior: false });
return this.betweenTime(interval.from, interval.to, {
includeInferior: true,
includeSuperior: false,
});
});

@@ -360,5 +425,13 @@ return partitions.map((p, idx) => {

/**
* Splits a timeserie into multiple timeseries where each timeserie has
* a maximum of `options.chunks` points.
*/
split(options) {
return chunk(this.toArray(), options.chunks).map((points) => {
return this.recreate(points);
});
}
/**
* Resample the timeserie using a new time interval and a point aggregation function
* @param options
* @returns
*/

@@ -368,23 +441,32 @@ resample(options) {

if (!from) {
throw new Error('Cannot infer a lower bound for resample');
throw new Error("Cannot infer a lower bound for resample");
}
const to = options.to || this.last()[0];
if (!to) {
throw new Error('Cannot infer an upper bound for resample');
throw new Error("Cannot infer an upper bound for resample");
}
return TimeSerie.concat(this.partition(options)
.map((chunk) => chunk.reduce(options)));
return TimeSerie.concat(this.partition(options).map((chunk) => chunk.reduce(options)));
}
/**
* Remove the point at the given time and returns a new serie
*/
removeAt(time) {
return this.recreate(this.data.filter((p) => { return p[0] !== DateLikeToString(time); }));
return this.recreate(this.data.filter((p) => {
return p[0] !== DateLikeToString(time);
}));
}
/**
* Remove the point at the given index and returns a new serie
*/
removeAtIndex(index) {
return this.recreate(this.data.filter((_, i) => { return i !== index; }));
return this.recreate(this.data.filter((_, i) => {
return i !== index;
}));
}
/**
*
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
* @returns New timeserie without the removed data. Bounds are removed.
*/
* Returns the new timeserie without the removed data. Bounds are removed.
*
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
*/
removeBetweenTime(from, to) {

@@ -394,9 +476,16 @@ const f = new Date(from);

const data = this.data.filter((point) => {
return new Date(point[0]).getTime() < f.getTime() || new Date(point[0]).getTime() > t.getTime();
return (new Date(point[0]).getTime() < f.getTime() ||
new Date(point[0]).getTime() > t.getTime());
});
return this.recreate(data);
}
/**
* Removes points with NaN value from the serie
*/
dropNaN() {
return this.filter((p) => isNumeric(p[1]));
}
/**
* Removes points with null value from the serie.
*/
dropNull() {

@@ -406,3 +495,3 @@ return this.filter((p) => p[1] !== null);

/**
*
* Rounds the serie's points.
* @param decimals {Number} the number of decimals to keep

@@ -412,5 +501,13 @@ * @returns {TimeSerie}

round(decimals) {
return this.map((p) => ([p[0], Number(Number(p[1]).toFixed(decimals))]));
return this.map((p) => [
p[0],
Number(Number(p[1]).toFixed(decimals)),
]);
}
// Operation between timeseries
/**
* Combine the current serie with an array of series y performing combination operations, such as multiplication, addition ecc.
* @param operation {string}
* @param series {TimeSerie[]}
* @param options {TimeSeriesOperationOptions}
*/
combine(operation, series, options = {}) {

@@ -421,32 +518,52 @@ options.name = options.name || this.name;

}
/**
* Adds values to the timeserie. If a scalar is passed, its value is added to every point in the serie. If another serie
* is passed, the two series are combined by addition.
* @see combine
*/
add(value) {
if (typeof value === 'number') {
if (typeof value === "number") {
return this.map((point) => [point[0], point[1] + value]);
}
else {
return this.combine('add', [value]);
return this.combine("add", [value]);
}
}
/**
* Subtracts values from the timeserie. If a scalar is passed, its value is subtracted from every point in the serie. If another serie
* is passed, the two series are combined by subtraction.
* @see combine
*/
sub(value) {
if (typeof value === 'number') {
if (typeof value === "number") {
return this.map((point) => [point[0], point[1] - value]);
}
else {
return this.combine('sub', [value]);
return this.combine("sub", [value]);
}
}
/**
* Multiplies values of the timeserie. If a scalar is passed, every point in the serie is multiplied times that value. If another serie
* is passed, the two series are combined by multiplication.
* @see combine
*/
mul(value) {
if (typeof value === 'number') {
if (typeof value === "number") {
return this.map((point) => [point[0], point[1] * value]);
}
else {
return this.combine('mul', [value]);
return this.combine("mul", [value]);
}
}
/**
* Divides values of the timeserie. If a scalar is passed, every point in the serie is divided by that value. If another serie
* is passed, the two series are combined by division.
* @see combine
*/
div(value) {
if (typeof value === 'number') {
if (typeof value === "number") {
return this.map((point) => [point[0], point[1] / value]);
}
else {
return this.combine('div', [value]);
return this.combine("div", [value]);
}

@@ -462,8 +579,7 @@ }

TimeSerie.internals.combine = (series, combiner, options) => {
const points = series[0].data.map((p) => p[0]).map((idx) => {
const points = series[0].data
.map((p) => p[0])
.map((idx) => {
const values = series.map((serie) => serie.atTime(idx, options.fill));
return [
idx,
combiner(values, idx)
];
return [idx, combiner(values, idx)];
});

@@ -476,4 +592,4 @@ return new TimeSerie(options.name, points, options.metadata);

TimeSerie.internals.combiners.div = (points) => points.reduce((a, b) => a / b, points[0] * points[0]);
TimeSerie.internals.combiners.avg = (points) => (TimeSerie.internals.combiners.add(points) / points.length);
TimeSerie.internals.combiners.avg = (points) => TimeSerie.internals.combiners.add(points) / points.length;
TimeSerie.createIndex = createIndex;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXNlcmllLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90aW1lc2VyaWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBcUgsWUFBWSxFQUFzRyxNQUFNLFNBQVMsQ0FBQTtBQUMxUSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFFMUMsU0FBUyxTQUFTLENBQUUsR0FBb0I7SUFDdEMsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUMvQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQSxDQUFDLDJCQUEyQjtJQUNyRSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQVUsQ0FBQyxJQUFJLG1HQUFtRztRQUM5SCxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQSxDQUFDLDJDQUEyQztBQUN2RSxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUUsTUFBc0M7SUFDekQsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQVEsRUFBRSxDQUFRLEVBQUUsRUFBRTtRQUNuRCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDZixPQUFPLENBQUMsQ0FBQTtTQUNUO2FBQU07WUFDTCxPQUFPLENBQUMsQ0FBQyxDQUFBO1NBQ1Y7SUFDSCxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBRSxDQUFRO0lBQy9CLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUN2QyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxN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QUFDLE1BQU0sS0FBSyxDQUFDLENBQUE7SUFDL0IsQ0FBQztJQUVELElBQUk7UUFDRixPQUFPLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDM0QsQ0FBQztJQUVELEdBQUc7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDdkIsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQTtTQUNwQjtRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDNUcsQ0FBQztJQUVEOzs7T0FHRztJQUNILEdBQUc7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDdkIsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQTtTQUNwQjtRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtJQUN6RCxDQUFDO0lBRUQsS0FBSztRQUNILElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtZQUN0QixPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFBO1NBQ3BCO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQzNCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRTtZQUN2QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7U0FDdkI7UUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM1RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSztRQUNILE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUE7SUFDN0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxPQUFPLENBQUUsSUFBYztRQUNyQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBUSxFQUFFLEVBQUUsR0FBRyxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDdEcsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUk7UUFDRixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQTtJQUM3QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsR0FBRztRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRTtZQUN2QixPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFBO1NBQ3BCO1FBQ0QsSUFB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UyxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQW9CLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFZLEVBQUUsQ0FBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtBQUNqSSxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFvQixFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBWSxFQUFFLENBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUNySCxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFvQixFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBWSxFQUFFLENBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDekksU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBb0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBRXpILFNBQVMsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFBIn0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXNlcmllLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90aW1lc2VyaWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFdBQVcsRUFXWCxZQUFZLEdBS2IsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVsRCxPQUFPLEtBQUssT0FBTyxNQUFNLFNBQVMsQ0FBQztBQUVuQyxTQUFTLFNBQVMsQ0FBQyxHQUFvQjtJQUNyQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7UUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hELElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsMkJBQTJCO0lBQ3RFLE9BQU8sQ0FDTCxDQUFDLEtBQUssQ0FBQyxHQUFVLENBQUMsSUFBSSxtR0FBbUc7UUFDekgsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQ3hCLENBQUMsQ0FBQywyQ0FBMkM7QUFDaEQsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLE1BQXNDO0lBQ3hELE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUIsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFRLEVBQUUsQ0FBUSxFQUFFLEVBQUU7UUFDdkMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2YsT0FBTyxDQUFDLENBQUM7U0FDVjthQUFNO1lBQ0wsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUNYO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxDQUFRO0lBQzlCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sU0FBUztJQVFwQjs7Ozs7T0FLRztJQUNILFlBQ0UsSUFBWSxFQUNaLEtBQXFDLEVBQ3JDLFdBQXFCLEVBQUU7UUFFdkIsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRTthQUNaLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ2pCLE1BQU0sQ0FBQyxDQUFDLEdBQWtDLEVBQUUsQ0FBUSxFQUFFLEVBQUU7WUFDdkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQVksRUFBRSxPQUF5QjtRQUN0RCxPQUFPLElBQUksU0FBUyxDQUNsQixPQUFPLENBQUMsSUFBSSxFQUNaLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsRUFDcEQsT0FBTyxDQUFDLFFBQVEsQ0FDakIsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsT0FBTyxDQUFDLEtBQVksRUFBRSxPQUF3QjtRQUM1QyxJQUFJLE9BQU8sQ0FBQyxZQUFZLEtBQUssSUFBSSxFQUFFO1lBQ2pDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2RCxPQUFPLElBQUksU0FBUyxDQUNsQixJQUFJLENBQUMsSUFBSSxFQUNULEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUNwRSxJQUFJLENBQUMsUUFBUSxDQUNkLENBQUM7U0FDSDtRQUNELE9BQU8sSUFBSSxTQUFTLENBQ2xCLElBQUksQ0FBQyxJQUFJLEVBQ1QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQ3RFLElBQUksQ0FBQyxRQUFRLENBQ2QsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsSUFBWTtRQUNqQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsUUFBUSxDQUFDLEtBQXFDO1FBQzVDLE9BQU8sSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRDs7O09BR0c7SUFDSCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQW1CO1FBQy9CLE9BQU8sSUFBSSxTQUFTLENBQ2xCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQ2QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQzFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQzVELENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYztRQUNaLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJO2FBQ3JCLE1BQU0sQ0FBQyxFQUFFLENBQUM7YUFDVixPQUFPLEVBQUU7YUFDVCxJQUFJLENBQUMsQ0FBQyxLQUFZLEVBQUUsRUFBRTtZQUNyQixPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7UUFDTCxJQUFJLE1BQU0sRUFBRTtZQUNWLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2xCO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQztTQUNiO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILGVBQWU7UUFDYixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQVksRUFBRSxFQUFFO1lBQzdDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksTUFBTSxFQUFFO1lBQ1YsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbEI7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDO1NBQ2I7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjO1FBQ1osTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUk7YUFDckIsTUFBTSxDQUFDLEVBQUUsQ0FBQzthQUNWLE9BQU8sRUFBRTthQUNULElBQUksQ0FBQyxDQUFDLEtBQVksRUFBRSxFQUFFO1lBQ3JCLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixDQUFDLENBQUMsQ0FBQztRQUNMLElBQUksTUFBTSxFQUFFO1lBQ1YsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbEI7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDO1NBQ2I7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ2IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFZLEVBQUUsRUFBRTtZQUM3QyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLE1BQU0sRUFBRTtZQUNWLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2xCO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQztTQUNiO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxJQUFjLEVBQUUsWUFBb0IsSUFBSTtRQUM3QyxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxPQUFPLENBQUMsS0FBYTtRQUNuQixJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7U0FDeEM7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsV0FBVyxDQUNULElBQWMsRUFDZCxFQUFZLEVBQ1osVUFBOEI7UUFDNUIsZUFBZSxFQUFFLElBQUk7UUFDckIsZUFBZSxFQUFFLElBQUk7S0FDdEI7UUFFRCxNQUFNLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUNyRCxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QixNQUFNLElBQUksR0FBWSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQVksRUFBRSxFQUFFO1lBQ3RELElBQUksZUFBZSxJQUFJLGVBQWUsRUFBRTtnQkFDdEMsT0FBTyxDQUNMLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUU7b0JBQzNDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FDNUMsQ0FBQzthQUNIO2lCQUFNLElBQUksZUFBZSxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUM5QyxPQUFPLENBQ0wsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRTtvQkFDM0MsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUMzQyxDQUFDO2FBQ0g7aUJBQU0sSUFBSSxDQUFDLGVBQWUsSUFBSSxlQUFlLEVBQUU7Z0JBQzlDLE9BQU8sQ0FDTCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFO29CQUMxQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQzVDLENBQUM7YUFDSDtpQkFBTTtnQkFDTCxPQUFPLENBQ0wsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRTtvQkFDMUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUMzQyxDQUFDO2FBQ0g7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxjQUFjLENBQUMsSUFBWSxFQUFFLEVBQVU7UUFDckMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBUSxFQUFFLENBQVMsRUFBRSxFQUFFO1lBQ3pDLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxFQUEwQjtRQUMvQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsR0FBRyxDQUFDLEVBQTBCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNILE9BQU87UUFDTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJO1FBQ0YsT0FBTyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRDs7T0FFRztJQUNILEdBQUc7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDdkIsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNyQjtRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1QixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDWixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDeEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzVCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQy9CLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkI7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNILEdBQUc7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDdkIsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNyQjtRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1QixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLO1FBQ0gsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ3RCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDckI7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN4QjtRQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLO1FBQ0gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsT0FBTyxDQUFDLElBQWM7UUFDcEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQVEsRUFBRSxFQUFFO1lBQ2pDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDOUQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSTtRQUNGLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQzlDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxHQUFHO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ3ZCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDckI7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3JCO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FDckIsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQzFELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQ2IsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxHQUFHO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ3ZCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDckI7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3JCO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FDckIsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQzFELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQ2IsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxPQUErQjtRQUNwQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLENBQUMsT0FBeUI7UUFDakMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1NBQzVEO1FBQ0QsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1NBQzdEO1FBRUQsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwRSxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBc0IsRUFBRSxFQUFFO1lBQzFELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xELGVBQWUsRUFBRSxJQUFJO2dCQUNyQixlQUFlLEVBQUUsS0FBSzthQUN2QixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQVksRUFBRSxHQUFXLEVBQUUsRUFBRTtZQUNsRCxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQ3BCLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDaEU7aUJBQU0sSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDN0QsTUFBTSxRQUFRLEdBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNsRSxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNuRDtpQkFBTTtnQkFDTCxPQUFPLENBQUMsQ0FBQzthQUNWO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLE9BQXFCO1FBQ3pCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBZSxFQUFFLEVBQUU7WUFDbkUsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVEsQ0FBQyxPQUF3QjtRQUMvQixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1NBQzVEO1FBQ0QsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNQLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztTQUM3RDtRQUVELE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FDckIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFnQixFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQ3pFLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRLENBQUMsSUFBYztRQUNyQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBUSxFQUFFLEVBQUU7WUFDNUIsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWEsQ0FBQyxLQUFhO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFRLEVBQUUsQ0FBUyxFQUFFLEVBQUU7WUFDdkMsT0FBTyxDQUFDLEtBQUssS0FBSyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxpQkFBaUIsQ0FBQyxJQUFjLEVBQUUsRUFBWTtRQUM1QyxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQVksRUFBRSxFQUFFO1lBQzdDLE9BQU8sQ0FDTCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFO2dCQUMxQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQzNDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBUSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsUUFBZ0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBUSxFQUFFLEVBQUUsQ0FBQztZQUM1QixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ0osTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDdkMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsT0FBTyxDQUNMLFNBQWlCLEVBQ2pCLE1BQW1CLEVBQ25CLFVBQXNDLEVBQUU7UUFFeEMsT0FBTyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDekMsT0FBTyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDckQsT0FBTyxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FDaEMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFDekMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQ3hDLE9BQU8sQ0FDUixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxHQUFHLENBQUMsS0FBeUI7UUFDM0IsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDN0IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUNqRTthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDckM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEdBQUcsQ0FBQyxLQUF5QjtRQUMzQixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUM3QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFZLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ2pFO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUNyQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsR0FBRyxDQUFDLEtBQXlCO1FBQzNCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1lBQzdCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDakU7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ3JDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxHQUFHLENBQUMsS0FBeUI7UUFDM0IsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDN0IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUNqRTthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDckM7SUFDSCxDQUFDOztBQTFsQmEsbUJBQVMsR0FBUSxFQUFFLENBQUM7QUE2bEJwQyxnRUFBZ0U7QUFDaEUsaUhBQWlIO0FBQ2pILDBCQUEwQjtBQUMxQixTQUFTLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztBQUN6QixTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFDbkMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsQ0FDNUIsTUFBbUIsRUFDbkIsUUFBZ0MsRUFDaEMsT0FBbUMsRUFDeEIsRUFBRTtJQUNiLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1NBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3ZCLEdBQUcsQ0FBQyxDQUFDLEdBQVcsRUFBRSxFQUFFO1FBQ25CLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFnQixFQUFFLEVBQUUsQ0FDN0MsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUNoQyxDQUFDO1FBQ0YsT0FBTyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFVLENBQUM7SUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxPQUFPLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvRCxDQUFDLENBQUM7QUFFRixTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFvQixFQUFFLEVBQUUsQ0FDM0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQWEsRUFBRSxDQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUQsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBb0IsRUFBRSxFQUFFLENBQzNELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFhLEVBQUUsQ0FBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN4RSxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFvQixFQUFFLEVBQUUsQ0FDM0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQWEsRUFBRSxDQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUQsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBb0IsRUFBRSxFQUFFLENBQzNELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFhLEVBQUUsQ0FBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRixTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFvQixFQUFFLEVBQUUsQ0FDM0QsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7QUFFNUQsU0FBUyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMifQ==

@@ -1,29 +0,29 @@

import test from 'ava';
import { TimeSerie } from './timeserie';
test('TimeSerie.atTime() should return the correct point or null', (t) => {
import test from "ava";
import { TimeSerie } from "./timeserie";
test("TimeSerie.atTime() should return the correct point or null", (t) => {
const data = [
['2021-01-01T00:00:00.000Z', 4],
['2021-01-02T00:00:00.000Z', 5],
['2021-01-03T00:00:00.000Z', 6]
["2021-01-01T00:00:00.000Z", 4],
["2021-01-02T00:00:00.000Z", 5],
["2021-01-03T00:00:00.000Z", 6],
];
const ts = new TimeSerie('energy', data);
t.is(ts.atTime('2021-01-02T00:00:00.000Z'), 5);
t.is(ts.atTime('2021-01-22T00:00:00.000Z'), null);
const ts = new TimeSerie("energy", data);
t.is(ts.atTime("2021-01-02T00:00:00.000Z"), 5);
t.is(ts.atTime("2021-01-22T00:00:00.000Z"), null);
});
test('TimeSerie.atIndex() should return the correct point', (t) => {
test("TimeSerie.atIndex() should return the correct point", (t) => {
const data = [
['2021-01-01T00:00:00.000Z', 4],
['2021-01-02T00:00:00.000Z', 5],
['2021-01-03T00:00:00.000Z', 6]
["2021-01-01T00:00:00.000Z", 4],
["2021-01-02T00:00:00.000Z", 5],
["2021-01-03T00:00:00.000Z", 6],
];
const ts = new TimeSerie('energy', data);
const ts = new TimeSerie("energy", data);
t.is(ts.atIndex(1), 5);
});
test('TimeSerie.atIndex() should throw when the index is out of bounds', (t) => {
test("TimeSerie.atIndex() should throw when the index is out of bounds", (t) => {
const data = [
['2021-01-01T00:00:00.000Z', 4],
['2021-01-02T00:00:00.000Z', 5],
['2021-01-03T00:00:00.000Z', 6]
["2021-01-01T00:00:00.000Z", 4],
["2021-01-02T00:00:00.000Z", 5],
["2021-01-03T00:00:00.000Z", 6],
];
const ts = new TimeSerie('energy', data);
const ts = new TimeSerie("energy", data);
t.throws(() => {

@@ -33,76 +33,76 @@ ts.atIndex(100);

});
test('TimeSerie.toArray() should return the whole data', (t) => {
test("TimeSerie.toArray() should return the whole data", (t) => {
const data = [
['2021-01-01T00:00:00.000Z', 4],
['2021-01-02T00:00:00.000Z', 5],
['2021-01-03T00:00:00.000Z', 6]
["2021-01-01T00:00:00.000Z", 4],
["2021-01-02T00:00:00.000Z", 5],
["2021-01-03T00:00:00.000Z", 6],
];
const ts = new TimeSerie('energy', data);
const ts = new TimeSerie("energy", data);
t.deepEqual(data, ts.toArray());
});
test('TimeSerie.firstValidIndex() should return the first valid value index', (t) => {
test("TimeSerie.firstValidIndex() should return the first valid value index", (t) => {
const data = [
['2021-01-01T00:00:00.000Z', null],
['2021-01-02T00:00:00.000Z', null],
['2021-01-03T00:00:00.000Z', 6],
['2021-01-04T00:00:00.000Z', 7],
['2021-01-05T00:00:00.000Z', 8],
['2021-01-06T00:00:00.000Z', null]
["2021-01-01T00:00:00.000Z", null],
["2021-01-02T00:00:00.000Z", null],
["2021-01-03T00:00:00.000Z", 6],
["2021-01-04T00:00:00.000Z", 7],
["2021-01-05T00:00:00.000Z", 8],
["2021-01-06T00:00:00.000Z", null],
];
const ts = new TimeSerie('energy', data);
t.is(ts.firstValidIndex(), '2021-01-03T00:00:00.000Z');
const ts = new TimeSerie("energy", data);
t.is(ts.firstValidIndex(), "2021-01-03T00:00:00.000Z");
});
test('TimeSerie.lastValidIndex() should return the last valid value index', (t) => {
test("TimeSerie.lastValidIndex() should return the last valid value index", (t) => {
const data = [
['2021-01-01', null],
['2021-01-02', null],
['2021-01-03', 6],
['2021-01-04', 7],
['2021-01-05', 8],
['2021-01-06', null]
["2021-01-01", null],
["2021-01-02", null],
["2021-01-03", 6],
["2021-01-04", 7],
["2021-01-05", 8],
["2021-01-06", null],
];
const ts = new TimeSerie('energy', data);
t.is(ts.lastValidIndex(), '2021-01-05T00:00:00.000Z');
const ts = new TimeSerie("energy", data);
t.is(ts.lastValidIndex(), "2021-01-05T00:00:00.000Z");
});
test('TimeSerie.firstValidValue() should return the first valid value index or null', (t) => {
test("TimeSerie.firstValidValue() should return the first valid value index or null", (t) => {
const data = [
['2021-01-01', null],
['2021-01-02', null],
['2021-01-03', 6],
['2021-01-04', 7],
['2021-01-05', 8],
['2021-01-06', null]
["2021-01-01", null],
["2021-01-02", null],
["2021-01-03", 6],
["2021-01-04", 7],
["2021-01-05", 8],
["2021-01-06", null],
];
const ts = new TimeSerie('energy', data);
const ts = new TimeSerie("energy", data);
t.is(ts.firstValidValue(), 6);
const data2 = [
['2021-01-01', null],
['2021-01-02', null]
["2021-01-01", null],
["2021-01-02", null],
];
const ts2 = new TimeSerie('energy2', data2);
const ts2 = new TimeSerie("energy2", data2);
t.is(ts2.firstValidValue(), null);
});
test('TimeSerie.lastValidValue() should return the last valid value index', (t) => {
test("TimeSerie.lastValidValue() should return the last valid value index", (t) => {
const data = [
['2021-01-01', null],
['2021-01-02', null],
['2021-01-03', 6],
['2021-01-04', 7],
['2021-01-05', 8],
['2021-01-06', null]
["2021-01-01", null],
["2021-01-02", null],
["2021-01-03", 6],
["2021-01-04", 7],
["2021-01-05", 8],
["2021-01-06", null],
];
const ts = new TimeSerie('energy', data);
const ts = new TimeSerie("energy", data);
t.is(ts.lastValidValue(), 8);
});
test('TimeSerie.betweenTime() should return the correct timeserie subset', (t) => {
test("TimeSerie.betweenTime() should return the correct timeserie subset", (t) => {
const data = [
['2021-01-01', 4],
['2021-01-02', 5],
['2021-01-03', 6],
['2021-01-04', 7],
['2021-01-05', 8],
['2021-01-06', 9]
["2021-01-01", 4],
["2021-01-02", 5],
["2021-01-03", 6],
["2021-01-04", 7],
["2021-01-05", 8],
["2021-01-06", 9],
];
const ts = new TimeSerie('energy', data);
const subset = ts.betweenTime('2021-01-03', '2021-01-05');
const ts = new TimeSerie("energy", data);
const subset = ts.betweenTime("2021-01-03", "2021-01-05");
t.is(subset.length(), 3);

@@ -112,12 +112,12 @@ t.is(subset.firstValidValue(), 6);

});
test('TimeSerie.filter() should allow to pass custom filtering logic', (t) => {
test("TimeSerie.filter() should allow to pass custom filtering logic", (t) => {
const data = [
['2021-01-01', 4],
['2021-01-02', 5],
['2021-01-03', 6],
['2021-01-04', 7],
['2021-01-05', 8],
['2021-01-06', 9]
["2021-01-01", 4],
["2021-01-02", 5],
["2021-01-03", 6],
["2021-01-04", 7],
["2021-01-05", 8],
["2021-01-06", 9],
];
const ts = new TimeSerie('energy', data);
const ts = new TimeSerie("energy", data);
const filtered = ts.filter((p) => {

@@ -130,12 +130,12 @@ return p[1] % 2 === 0;

});
test('TimeSerie.map() should allow to pass custom mapping logic', (t) => {
test("TimeSerie.map() should allow to pass custom mapping logic", (t) => {
const data = [
['2021-01-01', 4],
['2021-01-02', 5],
['2021-01-03', 6],
['2021-01-04', 7],
['2021-01-05', 8],
['2021-01-06', 9]
["2021-01-01", 4],
["2021-01-02", 5],
["2021-01-03", 6],
["2021-01-04", 7],
["2021-01-05", 8],
["2021-01-06", 9],
];
const ts = new TimeSerie('energy', data);
const ts = new TimeSerie("energy", data);
const mapped = ts.map((p) => {

@@ -148,125 +148,129 @@ return [p[0], p[1] * 2];

});
test('TimeSerie.isEmpty() should behave correctly', (t) => {
const data = [
['2021-01-01', 4]
];
const ts1 = new TimeSerie('energy', data);
const ts2 = new TimeSerie('energy', []);
test("TimeSerie.isEmpty() should behave correctly", (t) => {
const data = [["2021-01-01", 4]];
const ts1 = new TimeSerie("energy", data);
const ts2 = new TimeSerie("energy", []);
t.is(ts1.isEmpty(), false);
t.is(ts2.isEmpty(), true);
});
test('Timeserie.sum() should return the sum of the values', (t) => {
test("Timeserie.sum() should return the sum of the values", (t) => {
const data = [
['2021-01-01', 4],
['2021-01-02', 5],
['2021-01-03', null],
['2021-01-04', 7],
['2021-01-05', 8],
['2021-01-06', 9]
["2021-01-01", 4],
["2021-01-02", 5],
["2021-01-03", null],
["2021-01-04", 7],
["2021-01-05", 8],
["2021-01-06", 9],
];
const ts = new TimeSerie('energy', data);
const ts = new TimeSerie("energy", data);
t.is(ts.sum()[1], 33);
});
test('Timeserie.avg() should return the average of the values', (t) => {
test("Timeserie.avg() should return the average of the values", (t) => {
const data = [
['2021-01-01', 4],
['2021-01-02', 4],
['2021-01-03', null]
["2021-01-01", 4],
["2021-01-02", 4],
["2021-01-03", null],
];
const ts = new TimeSerie('energy', data);
const ts = new TimeSerie("energy", data);
t.is(ts.avg()[1], 4);
});
test('Timeserie.first() should return the first point or null', (t) => {
const ts1 = new TimeSerie('ts1', [['2021-01-01', 4]]);
const ts2 = new TimeSerie('ts2', []);
test("Timeserie.first() should return the first point or null", (t) => {
const ts1 = new TimeSerie("ts1", [["2021-01-01", 4]]);
const ts2 = new TimeSerie("ts2", []);
t.is(ts1.first()[1], 4);
t.is(ts2.first(), null);
});
test('Timeserie.firstAt() should return the first point with time >= the given', (t) => {
test("Timeserie.firstAt() should return the first point with time >= the given", (t) => {
const data = [
['2021-01-01', 4],
['2021-01-02', 4],
['2021-01-04', 8],
['2021-01-05', 8]
["2021-01-01", 4],
["2021-01-02", 4],
["2021-01-04", 8],
["2021-01-05", 8],
];
const ts = new TimeSerie('energy', data);
t.is(ts.firstAt('2021-01-02')[1], 4);
t.is(ts.firstAt('2021-01-03')[1], 8);
const ts = new TimeSerie("energy", data);
t.is(ts.firstAt("2021-01-02")[1], 4);
t.is(ts.firstAt("2021-01-03")[1], 8);
});
test('Timeserie.last() should return the last point or null', (t) => {
const ts1 = new TimeSerie('ts1', [['2021-01-01', 4], ['2021-01-02', 5]]);
const ts2 = new TimeSerie('ts2', []);
test("Timeserie.last() should return the last point or null", (t) => {
const ts1 = new TimeSerie("ts1", [
["2021-01-01", 4],
["2021-01-02", 5],
]);
const ts2 = new TimeSerie("ts2", []);
t.is(ts1.last()[1], 5);
t.is(ts2.last(), null);
});
test('Timeserie.max() should return the point with maximum value', (t) => {
test("Timeserie.max() should return the point with maximum value", (t) => {
const data = [
['2021-01-01', 4],
['2021-01-02', 11],
['2021-01-04', 8],
['2021-01-05', 8]
["2021-01-01", 4],
["2021-01-02", 11],
["2021-01-04", 8],
["2021-01-05", 8],
];
const ts = new TimeSerie('energy', data);
const ts = new TimeSerie("energy", data);
t.is(ts.max()[1], 11);
});
test('Timeserie.min() should return the point with minimum value', (t) => {
test("Timeserie.min() should return the point with minimum value", (t) => {
const data = [
['2021-01-01', 4],
['2021-01-02', 11],
['2021-01-04', 8],
['2021-01-05', 8]
["2021-01-01", 4],
["2021-01-02", 11],
["2021-01-04", 8],
["2021-01-05", 8],
];
const ts = new TimeSerie('energy', data);
const ts = new TimeSerie("energy", data);
t.is(ts.min()[1], 4);
});
test('Timeserie.partition() should partition the timeserie', (t) => {
test("Timeserie.partition() should partition the timeserie", (t) => {
const data = [
['2021-01-01T12:00:00.000Z', 4],
['2021-01-01T20:00:00.000Z', 4],
['2021-01-02T12:00:00.000Z', 4],
['2021-01-02T20:00:00.000Z', 4],
['2021-01-03T12:00:00.000Z', 4],
['2021-01-03T13:00:00.000Z', 4],
['2021-01-03T20:00:00.000Z', 4],
['2021-01-04T12:00:00.000Z', 4],
['2021-01-04T16:00:00.000Z', 4],
['2021-01-04T20:00:00.000Z', 4]
["2021-01-01T12:00:00.000Z", 4],
["2021-01-01T20:00:00.000Z", 4],
["2021-01-02T12:00:00.000Z", 4],
["2021-01-02T20:00:00.000Z", 4],
["2021-01-03T12:00:00.000Z", 4],
["2021-01-03T13:00:00.000Z", 4],
["2021-01-03T20:00:00.000Z", 4],
["2021-01-04T12:00:00.000Z", 4],
["2021-01-04T16:00:00.000Z", 4],
["2021-01-04T20:00:00.000Z", 4],
];
const ts = new TimeSerie('energy', data);
const ts = new TimeSerie("energy", data);
const chunks = ts.partition({ interval: 1000 * 60 * 60 * 24 });
t.is(chunks.length, 4);
});
test('Timeserie.reduce() should reduce the timeserie', (t) => {
test("Timeserie.reduce() should reduce the timeserie", (t) => {
const data = [
['2021-01-01T12:00:00.000Z', 4],
['2021-01-01T20:00:00.000Z', 4],
['2021-01-02T12:00:00.000Z', 4],
['2021-01-02T20:00:00.000Z', 4],
['2021-01-03T12:00:00.000Z', 4],
['2021-01-03T13:00:00.000Z', 4],
['2021-01-03T20:00:00.000Z', 4],
['2021-01-04T12:00:00.000Z', 4],
['2021-01-04T16:00:00.000Z', 4],
['2021-01-04T20:00:00.000Z', 4]
["2021-01-01T12:00:00.000Z", 4],
["2021-01-01T20:00:00.000Z", 4],
["2021-01-02T12:00:00.000Z", 4],
["2021-01-02T20:00:00.000Z", 4],
["2021-01-03T12:00:00.000Z", 4],
["2021-01-03T13:00:00.000Z", 4],
["2021-01-03T20:00:00.000Z", 4],
["2021-01-04T12:00:00.000Z", 4],
["2021-01-04T16:00:00.000Z", 4],
["2021-01-04T20:00:00.000Z", 4],
];
const ts = new TimeSerie('energy', data);
const result = ts.reduce({ operation: 'sum' });
const ts = new TimeSerie("energy", data);
const result = ts.reduce({ operation: "sum" });
t.is(result.length(), 1);
t.is(result.atIndex(0), 40);
});
test('Timeserie.resample(operation=sum) should provide the correct timeserie', (t) => {
test("Timeserie.resample(operation=sum) should provide the correct timeserie", (t) => {
const data = [
['2021-01-01T12:00:00.000Z', 4],
['2021-01-01T20:00:00.000Z', 4],
['2021-01-02T12:00:00.000Z', 4],
['2021-01-02T20:00:00.000Z', 4],
['2021-01-03T12:00:00.000Z', 4],
['2021-01-03T13:00:00.000Z', 4],
['2021-01-03T20:00:00.000Z', 4],
['2021-01-04T12:00:00.000Z', 4],
['2021-01-04T16:00:00.000Z', 4],
['2021-01-04T20:00:00.000Z', 4]
["2021-01-01T12:00:00.000Z", 4],
["2021-01-01T20:00:00.000Z", 4],
["2021-01-02T12:00:00.000Z", 4],
["2021-01-02T20:00:00.000Z", 4],
["2021-01-03T12:00:00.000Z", 4],
["2021-01-03T13:00:00.000Z", 4],
["2021-01-03T20:00:00.000Z", 4],
["2021-01-04T12:00:00.000Z", 4],
["2021-01-04T16:00:00.000Z", 4],
["2021-01-04T20:00:00.000Z", 4],
];
const ts = new TimeSerie('energy', data);
const daily = ts.resample({ interval: 1000 * 60 * 60 * 24, operation: 'sum' });
const ts = new TimeSerie("energy", data);
const daily = ts.resample({
interval: 1000 * 60 * 60 * 24,
operation: "sum",
});
t.is(daily.length(), 4);

@@ -278,17 +282,20 @@ t.is(daily.atIndex(0), 8);

});
test('Timeserie.resample().avg() should provide the correct timeserie', (t) => {
test("Timeserie.resample().avg() should provide the correct timeserie", (t) => {
const data = [
['2021-01-01T12:00:00.000Z', 4],
['2021-01-01T20:00:00.000Z', 4],
['2021-01-02T12:00:00.000Z', 4],
['2021-01-02T20:00:00.000Z', 4],
['2021-01-03T12:00:00.000Z', 4],
['2021-01-03T13:00:00.000Z', 4],
['2021-01-03T20:00:00.000Z', 4],
['2021-01-04T12:00:00.000Z', 4],
['2021-01-04T16:00:00.000Z', 4],
['2021-01-04T20:00:00.000Z', 4]
["2021-01-01T12:00:00.000Z", 4],
["2021-01-01T20:00:00.000Z", 4],
["2021-01-02T12:00:00.000Z", 4],
["2021-01-02T20:00:00.000Z", 4],
["2021-01-03T12:00:00.000Z", 4],
["2021-01-03T13:00:00.000Z", 4],
["2021-01-03T20:00:00.000Z", 4],
["2021-01-04T12:00:00.000Z", 4],
["2021-01-04T16:00:00.000Z", 4],
["2021-01-04T20:00:00.000Z", 4],
];
const ts = new TimeSerie('energy', data);
const daily = ts.resample({ interval: 1000 * 60 * 60 * 24, operation: 'avg' });
const ts = new TimeSerie("energy", data);
const daily = ts.resample({
interval: 1000 * 60 * 60 * 24,
operation: "avg",
});
t.is(daily.length(), 4);

@@ -300,17 +307,20 @@ t.is(daily.atIndex(0), 4);

});
test('Timeserie.resample().first() should provide the correct timeserie', (t) => {
test("Timeserie.resample().first() should provide the correct timeserie", (t) => {
const data = [
['2021-01-01T12:00:00.000Z', 1],
['2021-01-01T20:00:00.000Z', 2],
['2021-01-02T12:00:00.000Z', 1],
['2021-01-02T20:00:00.000Z', 2],
['2021-01-03T12:00:00.000Z', 1],
['2021-01-03T13:00:00.000Z', 2],
['2021-01-03T20:00:00.000Z', 3],
['2021-01-04T12:00:00.000Z', 1],
['2021-01-04T16:00:00.000Z', 2],
['2021-01-04T20:00:00.000Z', 3]
["2021-01-01T12:00:00.000Z", 1],
["2021-01-01T20:00:00.000Z", 2],
["2021-01-02T12:00:00.000Z", 1],
["2021-01-02T20:00:00.000Z", 2],
["2021-01-03T12:00:00.000Z", 1],
["2021-01-03T13:00:00.000Z", 2],
["2021-01-03T20:00:00.000Z", 3],
["2021-01-04T12:00:00.000Z", 1],
["2021-01-04T16:00:00.000Z", 2],
["2021-01-04T20:00:00.000Z", 3],
];
const ts = new TimeSerie('energy', data);
const daily = ts.resample({ interval: 1000 * 60 * 60 * 24, operation: 'first' });
const ts = new TimeSerie("energy", data);
const daily = ts.resample({
interval: 1000 * 60 * 60 * 24,
operation: "first",
});
t.is(daily.length(), 4);

@@ -322,17 +332,20 @@ t.is(daily.atIndex(0), 1);

});
test('Timeserie.resample().last() should provide the correct timeserie', (t) => {
test("Timeserie.resample().last() should provide the correct timeserie", (t) => {
const data = [
['2021-01-01T12:00:00.000Z', 1],
['2021-01-01T20:00:00.000Z', 2],
['2021-01-02T12:00:00.000Z', 1],
['2021-01-02T20:00:00.000Z', 2],
['2021-01-03T12:00:00.000Z', 1],
['2021-01-03T13:00:00.000Z', 2],
['2021-01-03T20:00:00.000Z', 3],
['2021-01-04T12:00:00.000Z', 1],
['2021-01-04T16:00:00.000Z', 2],
['2021-01-04T20:00:00.000Z', 3]
["2021-01-01T12:00:00.000Z", 1],
["2021-01-01T20:00:00.000Z", 2],
["2021-01-02T12:00:00.000Z", 1],
["2021-01-02T20:00:00.000Z", 2],
["2021-01-03T12:00:00.000Z", 1],
["2021-01-03T13:00:00.000Z", 2],
["2021-01-03T20:00:00.000Z", 3],
["2021-01-04T12:00:00.000Z", 1],
["2021-01-04T16:00:00.000Z", 2],
["2021-01-04T20:00:00.000Z", 3],
];
const ts = new TimeSerie('energy', data);
const daily = ts.resample({ interval: 1000 * 60 * 60 * 24, operation: 'last' });
const ts = new TimeSerie("energy", data);
const daily = ts.resample({
interval: 1000 * 60 * 60 * 24,
operation: "last",
});
t.is(daily.length(), 4);

@@ -344,17 +357,20 @@ t.is(daily.atIndex(0), 2);

});
test('Timeserie.resample().max() should provide the correct timeserie', (t) => {
test("Timeserie.resample().max() should provide the correct timeserie", (t) => {
const data = [
['2021-01-01T12:00:00.000Z', 1],
['2021-01-01T20:00:00.000Z', 2],
['2021-01-02T12:00:00.000Z', 4],
['2021-01-02T20:00:00.000Z', 2],
['2021-01-03T12:00:00.000Z', 8],
['2021-01-03T13:00:00.000Z', 11],
['2021-01-03T20:00:00.000Z', 3],
['2021-01-04T12:00:00.000Z', 100],
['2021-01-04T16:00:00.000Z', 2],
['2021-01-04T20:00:00.000Z', 3]
["2021-01-01T12:00:00.000Z", 1],
["2021-01-01T20:00:00.000Z", 2],
["2021-01-02T12:00:00.000Z", 4],
["2021-01-02T20:00:00.000Z", 2],
["2021-01-03T12:00:00.000Z", 8],
["2021-01-03T13:00:00.000Z", 11],
["2021-01-03T20:00:00.000Z", 3],
["2021-01-04T12:00:00.000Z", 100],
["2021-01-04T16:00:00.000Z", 2],
["2021-01-04T20:00:00.000Z", 3],
];
const ts = new TimeSerie('energy', data);
const daily = ts.resample({ interval: 1000 * 60 * 60 * 24, operation: 'max' });
const ts = new TimeSerie("energy", data);
const daily = ts.resample({
interval: 1000 * 60 * 60 * 24,
operation: "max",
});
t.is(daily.length(), 4);

@@ -366,17 +382,20 @@ t.is(daily.atIndex(0), 2);

});
test('Timeserie.resample().min() should provide the correct timeserie', (t) => {
test("Timeserie.resample().min() should provide the correct timeserie", (t) => {
const data = [
['2021-01-01T12:00:00.000Z', 1],
['2021-01-01T20:00:00.000Z', 2],
['2021-01-02T12:00:00.000Z', 4],
['2021-01-02T20:00:00.000Z', 2],
['2021-01-03T12:00:00.000Z', 8],
['2021-01-03T13:00:00.000Z', 11],
['2021-01-03T20:00:00.000Z', 3],
['2021-01-04T12:00:00.000Z', 100],
['2021-01-04T16:00:00.000Z', 2],
['2021-01-04T20:00:00.000Z', 3]
["2021-01-01T12:00:00.000Z", 1],
["2021-01-01T20:00:00.000Z", 2],
["2021-01-02T12:00:00.000Z", 4],
["2021-01-02T20:00:00.000Z", 2],
["2021-01-03T12:00:00.000Z", 8],
["2021-01-03T13:00:00.000Z", 11],
["2021-01-03T20:00:00.000Z", 3],
["2021-01-04T12:00:00.000Z", 100],
["2021-01-04T16:00:00.000Z", 2],
["2021-01-04T20:00:00.000Z", 3],
];
const ts = new TimeSerie('energy', data);
const daily = ts.resample({ interval: 1000 * 60 * 60 * 24, operation: 'min' });
const ts = new TimeSerie("energy", data);
const daily = ts.resample({
interval: 1000 * 60 * 60 * 24,
operation: "min",
});
t.is(daily.length(), 4);

@@ -388,17 +407,20 @@ t.is(daily.atIndex(0), 1);

});
test('Timeserie.resample().delta() should provide the correct timeserie', (t) => {
test("Timeserie.resample().delta() should provide the correct timeserie", (t) => {
const data = [
['2021-01-01T12:00:00.000Z', 1],
['2021-01-01T20:00:00.000Z', 2],
['2021-01-02T12:00:00.000Z', 3],
['2021-01-02T20:00:00.000Z', 4],
['2021-01-03T12:00:00.000Z', 5],
['2021-01-03T13:00:00.000Z', 8],
['2021-01-03T20:00:00.000Z', 9],
['2021-01-04T12:00:00.000Z', 10],
['2021-01-04T16:00:00.000Z', 12],
['2021-01-04T20:00:00.000Z', 15]
["2021-01-01T12:00:00.000Z", 1],
["2021-01-01T20:00:00.000Z", 2],
["2021-01-02T12:00:00.000Z", 3],
["2021-01-02T20:00:00.000Z", 4],
["2021-01-03T12:00:00.000Z", 5],
["2021-01-03T13:00:00.000Z", 8],
["2021-01-03T20:00:00.000Z", 9],
["2021-01-04T12:00:00.000Z", 10],
["2021-01-04T16:00:00.000Z", 12],
["2021-01-04T20:00:00.000Z", 15],
];
const ts = new TimeSerie('energy', data);
const daily = ts.resample({ interval: 1000 * 60 * 60 * 24, operation: 'delta' });
const ts = new TimeSerie("energy", data);
const daily = ts.resample({
interval: 1000 * 60 * 60 * 24,
operation: "delta",
});
t.is(daily.length(), 4);

@@ -411,22 +433,22 @@ t.is(daily.data[0][0], data[0][0]); // The resampling should start at the first time index

});
test('Timeserie.removeAt() should remove points from the timeserie', (t) => {
test("Timeserie.removeAt() should remove points from the timeserie", (t) => {
const data = [
['2021-01-01T00:00:00.000Z', 1],
['2021-01-02T00:00:00.000Z', 2],
['2021-01-03T00:00:00.000Z', 3],
['2021-01-04T00:00:00.000Z', 4]
["2021-01-01T00:00:00.000Z", 1],
["2021-01-02T00:00:00.000Z", 2],
["2021-01-03T00:00:00.000Z", 3],
["2021-01-04T00:00:00.000Z", 4],
];
const ts = new TimeSerie('energy', data);
const filtered = ts.removeAt('2021-01-03T00:00:00.000Z');
const ts = new TimeSerie("energy", data);
const filtered = ts.removeAt("2021-01-03T00:00:00.000Z");
t.is(filtered.length(), 3);
t.is(filtered.atIndex(2), 4);
});
test('Timeserie.removeAtIndex() should remove points from the timeserie', (t) => {
test("Timeserie.removeAtIndex() should remove points from the timeserie", (t) => {
const data = [
['2021-01-01T00:00:00.000Z', 1],
['2021-01-02T00:00:00.000Z', 2],
['2021-01-03T00:00:00.000Z', 3],
['2021-01-04T00:00:00.000Z', 4]
["2021-01-01T00:00:00.000Z", 1],
["2021-01-02T00:00:00.000Z", 2],
["2021-01-03T00:00:00.000Z", 3],
["2021-01-04T00:00:00.000Z", 4],
];
const ts = new TimeSerie('energy', data);
const ts = new TimeSerie("energy", data);
const filtered = ts.removeAtIndex(0);

@@ -436,23 +458,23 @@ t.is(filtered.length(), 3);

});
test('Timeserie.removeBetweenTime() should remove points from the timeserie', (t) => {
test("Timeserie.removeBetweenTime() should remove points from the timeserie", (t) => {
const data = [
['2021-01-01T00:00:00.000Z', 1],
['2021-01-02T00:00:00.000Z', 2],
['2021-01-03T00:00:00.000Z', 3],
['2021-01-04T00:00:00.000Z', 4]
["2021-01-01T00:00:00.000Z", 1],
["2021-01-02T00:00:00.000Z", 2],
["2021-01-03T00:00:00.000Z", 3],
["2021-01-04T00:00:00.000Z", 4],
];
const ts = new TimeSerie('energy', data);
const filtered = ts.removeBetweenTime('2021-01-02T00:00:00.000Z', '2021-01-03T00:00:00.000Z');
const ts = new TimeSerie("energy", data);
const filtered = ts.removeBetweenTime("2021-01-02T00:00:00.000Z", "2021-01-03T00:00:00.000Z");
t.is(filtered.length(), 2);
t.is(filtered.atIndex(1), 4);
});
test('Timeserie.dropNaN() should remove points from the timeserie', (t) => {
test("Timeserie.dropNaN() should remove points from the timeserie", (t) => {
const data = [
['2021-01-01T00:00:00.000Z', 1],
['2021-01-01T00:00:00.000Z', NaN],
['2021-01-02T00:00:00.000Z', 'hello'],
['2021-01-03T00:00:00.000Z', {}],
['2021-01-04T00:00:00.000Z', 4]
["2021-01-01T00:00:00.000Z", 1],
["2021-01-01T00:00:00.000Z", NaN],
["2021-01-02T00:00:00.000Z", "hello"],
["2021-01-03T00:00:00.000Z", {}],
["2021-01-04T00:00:00.000Z", 4],
];
const ts = new TimeSerie('energy', data);
const ts = new TimeSerie("energy", data);
const filtered = ts.dropNaN();

@@ -462,55 +484,71 @@ t.is(filtered.length(), 2);

});
test('Timeserie.dropNull() should remove points from the timeserie', (t) => {
test("Timeserie.dropNull() should remove points from the timeserie", (t) => {
const data = [
['2021-01-01T00:00:00.000Z', 1],
['2021-01-02T00:00:00.000Z', 'hello'],
['2021-01-03T00:00:00.000Z', null],
['2021-01-04T00:00:00.000Z', 4]
["2021-01-01T00:00:00.000Z", 1],
["2021-01-02T00:00:00.000Z", "hello"],
["2021-01-03T00:00:00.000Z", null],
["2021-01-04T00:00:00.000Z", 4],
];
const ts = new TimeSerie('energy', data);
const ts = new TimeSerie("energy", data);
const filtered = ts.dropNull();
t.is(filtered.length(), 3);
t.is(filtered.atIndex(1), 'hello');
t.is(filtered.atIndex(1), "hello");
t.is(filtered.atIndex(2), 4);
});
test('Timeserie.indexes() and Timeserie.values() should return correct values', (t) => {
test("Timeserie.indexes() and Timeserie.values() should return correct values", (t) => {
const data = [
['2021-01-01T00:00:00.000Z', 1],
['2021-01-02T00:00:00.000Z', 'hello']
["2021-01-01T00:00:00.000Z", 1],
["2021-01-02T00:00:00.000Z", "hello"],
];
const ts = new TimeSerie('energy', data);
const ts = new TimeSerie("energy", data);
const indexes = ts.indexes();
const values = ts.values();
t.is(indexes[0], '2021-01-01T00:00:00.000Z');
t.is(indexes[1], '2021-01-02T00:00:00.000Z');
t.is(indexes[0], "2021-01-01T00:00:00.000Z");
t.is(indexes[1], "2021-01-02T00:00:00.000Z");
t.is(values[0], 1);
t.is(values[1], 'hello');
t.is(values[1], "hello");
});
test('Timeserie.reindex() should correctly replace the series index', (t) => {
test("Timeserie.reindex() should correctly replace the series index", (t) => {
const data = [
['2021-01-01T00:00:00.000Z', 1],
['2021-01-02T00:00:00.000Z', 2]
["2021-01-01T00:00:00.000Z", 1],
["2021-01-02T00:00:00.000Z", 2],
];
const ts = new TimeSerie('energy', data);
const reindexed = ts.reindex(TimeSerie.createIndex({ from: ts.firstValidIndex(), to: ts.lastValidIndex(), interval: '1h' }), { fill: 0 });
const ts = new TimeSerie("energy", data);
const reindexed = ts.reindex(TimeSerie.createIndex({
from: ts.firstValidIndex(),
to: ts.lastValidIndex(),
interval: "1h",
}), { fill: 0 });
t.is(reindexed.length(), 25);
});
test('Timeserie.fromIndex() should correctly create the series', (t) => {
const idx = TimeSerie.createIndex({ from: '2022-01-01', to: '2022-01-01T23:00:00.000Z', interval: '1h' });
const ts = TimeSerie.fromIndex(idx, { fill: 1, name: 'ts' });
test("Timeserie.fromIndex() should correctly create the series", (t) => {
const idx = TimeSerie.createIndex({
from: "2022-01-01",
to: "2022-01-01T23:00:00.000Z",
interval: "1h",
});
const ts = TimeSerie.fromIndex(idx, { fill: 1, name: "ts" });
t.is(ts.length(), 24);
t.is(true, ts.toArray().every((item) => item[1] === 1));
});
test('Timeserie.combine() should correctly combine the series', (t) => {
const idx = TimeSerie.createIndex({ from: '2022-01-01', to: '2022-01-01T23:00:00.000Z', interval: '1h' });
const ts1 = TimeSerie.fromIndex(idx, { fill: 1, name: 'ts1' });
const ts2 = TimeSerie.fromIndex(idx, { fill: 2, name: 'ts2' });
const result = ts1.combine('add', [ts2]);
test("Timeserie.combine() should correctly combine the series", (t) => {
const idx = TimeSerie.createIndex({
from: "2022-01-01",
to: "2022-01-01T23:00:00.000Z",
interval: "1h",
});
const ts1 = TimeSerie.fromIndex(idx, { fill: 1, name: "ts1" });
const ts2 = TimeSerie.fromIndex(idx, { fill: 2, name: "ts2" });
const result = ts1.combine("add", [ts2]);
t.is(result.length(), ts1.length());
t.is(true, result.toArray().every((item) => item[1] === 3));
});
test('Timeserie.add() should correctly add the series to numbers and other series', (t) => {
const idx = TimeSerie.createIndex({ from: '2022-01-01', to: '2022-01-01T23:00:00.000Z', interval: '1h' });
const ts1 = TimeSerie.fromIndex(idx, { fill: 1, name: 'ts1' });
const ts2 = TimeSerie.fromIndex(idx, { fill: 2, name: 'ts2' });
test("Timeserie.add() should correctly add the series to numbers and other series", (t) => {
const idx = TimeSerie.createIndex({
from: "2022-01-01",
to: "2022-01-01T23:00:00.000Z",
interval: "1h",
});
const ts1 = TimeSerie.fromIndex(idx, { fill: 1, name: "ts1" });
const ts2 = TimeSerie.fromIndex(idx, { fill: 2, name: "ts2" });
const ts3 = ts1.add(ts2).add(7);

@@ -520,6 +558,10 @@ t.is(ts3.length(), ts1.length());

});
test('Timeserie.sub() should correctly diff the series to numbers and other series', (t) => {
const idx = TimeSerie.createIndex({ from: '2022-01-01', to: '2022-01-01T23:00:00.000Z', interval: '1h' });
const ts1 = TimeSerie.fromIndex(idx, { fill: 8, name: 'ts1' });
const ts2 = TimeSerie.fromIndex(idx, { fill: 4, name: 'ts2' });
test("Timeserie.sub() should correctly diff the series to numbers and other series", (t) => {
const idx = TimeSerie.createIndex({
from: "2022-01-01",
to: "2022-01-01T23:00:00.000Z",
interval: "1h",
});
const ts1 = TimeSerie.fromIndex(idx, { fill: 8, name: "ts1" });
const ts2 = TimeSerie.fromIndex(idx, { fill: 4, name: "ts2" });
const ts3 = ts1.sub(ts2).sub(7);

@@ -529,6 +571,10 @@ t.is(ts3.length(), ts1.length());

});
test('Timeserie.mul() should correctly multiply the series to numbers and other series', (t) => {
const idx = TimeSerie.createIndex({ from: '2022-01-01', to: '2022-01-01T23:00:00.000Z', interval: '1h' });
const ts1 = TimeSerie.fromIndex(idx, { fill: 1, name: 'ts1' });
const ts2 = TimeSerie.fromIndex(idx, { fill: 2, name: 'ts2' });
test("Timeserie.mul() should correctly multiply the series to numbers and other series", (t) => {
const idx = TimeSerie.createIndex({
from: "2022-01-01",
to: "2022-01-01T23:00:00.000Z",
interval: "1h",
});
const ts1 = TimeSerie.fromIndex(idx, { fill: 1, name: "ts1" });
const ts2 = TimeSerie.fromIndex(idx, { fill: 2, name: "ts2" });
const ts3 = ts1.mul(ts2).mul(7);

@@ -538,6 +584,10 @@ t.is(ts3.length(), ts1.length());

});
test('Timeserie.div() should correctly divide the series to numbers and other series', (t) => {
const idx = TimeSerie.createIndex({ from: '2022-01-01', to: '2022-01-01T23:00:00.000Z', interval: '1h' });
const ts1 = TimeSerie.fromIndex(idx, { fill: 16, name: 'ts1' });
const ts2 = TimeSerie.fromIndex(idx, { fill: 4, name: 'ts2' });
test("Timeserie.div() should correctly divide the series to numbers and other series", (t) => {
const idx = TimeSerie.createIndex({
from: "2022-01-01",
to: "2022-01-01T23:00:00.000Z",
interval: "1h",
});
const ts1 = TimeSerie.fromIndex(idx, { fill: 16, name: "ts1" });
const ts2 = TimeSerie.fromIndex(idx, { fill: 4, name: "ts2" });
const ts3 = ts1.div(ts2).div(4);

@@ -547,2 +597,20 @@ t.is(ts3.length(), ts1.length());

});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXNlcmllLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RpbWVzZXJpZS5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLEtBQUssQ0FBQTtBQUV0QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBR3ZDLElBQUksQ0FBQyw0REFBNEQsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQ3ZFLE1BQU0sSUFBSSxHQUFZO1FBQ3BCLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO0tBQ2hDLENBQUE7SUFDRCxNQUFNLEVBQUUsR0FBRyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFFeEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLDBCQUEwQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDOUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLDBCQUEwQixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7QUFDbkQsQ0FBQyxDQUFDLENBQUE7QUFFRixJQUFJLENBQUMscURBQXFELEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUNoRSxNQUFNLElBQUksR0FBWTtRQUNwQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztLQUNoQyxDQUFBO0lBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBRXhDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxD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QUFDLEVBQUUsRUFBRTtJQUNyRSxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsMEJBQTBCLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7SUFDekcsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBRTVELENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ3JCLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQy9ELENBQUMsQ0FBQyxDQUFBO0FBRUYsSUFBSSxDQUFDLHlEQUF5RCxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDcEUsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLDBCQUEwQixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ3pHLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtJQUM5RCxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7SUFDOUQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxH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
test("Timeserie.split() should split the timeserie", (t) => {
const data = [
["2021-01-01T12:00:00.000Z", 181],
["2021-01-01T20:00:00.000Z", 181],
["2021-01-02T12:00:00.000Z", 181],
["2021-01-02T20:00:00.000Z", 181],
["2021-01-03T12:00:00.000Z", 181],
["2021-01-03T13:00:00.000Z", 181],
["2021-01-03T20:00:00.000Z", 181],
["2021-01-04T12:00:00.000Z", 181],
["2021-01-04T16:00:00.000Z", 181],
["2021-01-04T20:00:00.000Z", 181],
];
const ts = new TimeSerie("energy", data);
const result = ts.split({ chunks: 3 });
t.is(result.length, 4);
t.deepEqual(result.map((ts) => ts.length()), [3, 3, 3, 1]);
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXNlcmllLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RpbWVzZXJpZS5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLEtBQUssQ0FBQztBQUV2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR3hDLElBQUksQ0FBQyw0REFBNEQsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQ3ZFLE1BQU0sSUFBSSxHQUFZO1FBQ3BCLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO0tBQ2hDLENBQUM7SUFDRixNQUFNLEVBQUUsR0FBRyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFekMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLDBCQUEwQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLDBCQUEwQixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDcEQsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMscURBQXFELEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUNoRSxNQUFNLElBQUksR0FBWTtRQUNwQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQztLQUNoQyxDQUFDO0lBQ0YsTUFBTSxFQUFFLEdBQUcsSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRXpDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxD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L0IsQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUM7S0FDaEMsQ0FBQztJQUVGLE1BQU0sRUFBRSxHQUFHLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUV6QyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDL0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBSSxDQUFDLGdEQUFnRCxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDM0QsTUFBTSxJQUFJLEdBQVk7UUFDcEIsQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUM7S0FDaEMsQ0FBQztJQUVGLE1BQU0sRUFBRSxHQUFHLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUV6QyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7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RSxHQUFHLEVBQUUsR0FBRyxFQUFFO1FBQzdCLFNBQVMsRUFBRSxNQUFNO0tBQ2xCLENBQUMsQ0FBQztJQUVILENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxQixDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFCLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM1QixDQUFDLENBQUMsQ0FBQztBQUVILElBQUksQ0FBQyxpRUFBaUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQzVFLE1BQU0sSUFBSSxHQUFZO1FBQ3BCLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxDQUFDO1FBQ2hDLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsR0FBRyxDQUFDO1FBQ2pDLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO0tBQ2hDLENBQUM7SUFFRixNQUFNLEVBQUUsR0FBRyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVB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

@@ -1,2 +0,2 @@

import { TimeSerie } from './timeserie';
import { TimeSerie } from "./timeserie";
export declare type PointValue = number | string | boolean | any;

@@ -57,3 +57,3 @@ export declare type DateLike = Date | string | number;

export declare type TimeserieIterator = (value: TimeSerie, index: number, array: ReadonlyArray<TimeSerie>) => any;
export declare type ColumnAggregation = 'avg' | 'last' | 'first' | 'min' | 'max' | 'delta' | 'sum';
export declare type ColumnAggregation = "avg" | "last" | "first" | "min" | "max" | "delta" | "sum";
export declare type ResampleDefaultAggregation = ColumnAggregation;

@@ -88,6 +88,6 @@ export declare type IntervalOptions = {

output: string;
operation: 'add' | 'mul' | 'div' | 'sub' | 'avg' | TimeseriePointCombiner;
operation: "add" | "mul" | "div" | "sub" | "avg" | TimeseriePointCombiner;
columns: string[];
}
export declare type ReduceOperation = 'min' | 'max' | 'first' | 'last' | 'avg' | 'sum' | 'delta';
export declare type ReduceOperation = "min" | "max" | "first" | "last" | "avg" | "sum" | "delta";
export declare type TimeFrameReduceOptions = {

@@ -106,3 +106,3 @@ operation: ReduceOperation;

}
export declare type PipelineStageType = 'aggregate' | 'resample' | 'project' | 'reduce' | 'add' | 'mul';
export declare type PipelineStageType = "aggregate" | "resample" | "project" | "reduce" | "add" | "mul";
export declare type PipelineStage = {

@@ -116,2 +116,9 @@ aggregate?: AggregationConfiguration;

};
export declare type SplitOptions = {
chunks: number;
};
export declare type BetweenTimeOptions = {
includeInferior: boolean;
includeSuperior: boolean;
};
export declare class TimeInterval {

@@ -118,0 +125,0 @@ from: Date;

@@ -1,5 +0,2 @@

import parse from 'parse-duration';
;
;
;
import parse from "parse-duration";
export class TimeInterval {

@@ -31,3 +28,3 @@ constructor(from, to) {

let size = options.interval;
if (typeof options.interval === 'string') {
if (typeof options.interval === "string") {
size = parse(options.interval);

@@ -44,2 +41,2 @@ }

}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLGdCQUFnQixDQUFBO0FBWWpDLENBQUM7QUFHRCxDQUFDO0FBOEJELENBQUM7QUEwRkYsTUFBTSxPQUFPLFlBQVk7SUFJdkIsWUFBYSxJQUFVLEVBQUUsRUFBUTtRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQTtRQUNoQixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQTtRQUNaLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUMzQyxDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBRSxJQUFjLEVBQUUsRUFBWSxFQUFFLFFBQWdCO1FBQzdELE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ3hCLElBQUksTUFBTSxHQUFTLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2pDLE1BQU0sU0FBUyxHQUFtQixFQUFFLENBQUE7UUFDcEMsT0FBTyxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3ZDLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQzdCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFBO1lBQ3ZELFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7WUFDOUMsTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1NBQ3hCO1FBQ0QsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztDQUNGO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUUsT0FBNkI7SUFDeEQsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQTtJQUMzQixJQUFJLE9BQU8sT0FBTyxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUU7UUFDeEMsSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7S0FDL0I7SUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDaEMsTUFBTSxNQUFNLEdBQVMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzNDLE1BQU0sS0FBSyxHQUFVLEVBQUUsQ0FBQTtJQUN2QixPQUFPLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDeEMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQTtRQUNoQyxNQUFNLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsR0FBSSxJQUFlLENBQUMsQ0FBQTtLQUNwRTtJQUNELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQyJ9
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBbUxuQyxNQUFNLE9BQU8sWUFBWTtJQUl2QixZQUFZLElBQVUsRUFBRSxFQUFRO1FBQzlCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUNiLElBQWMsRUFDZCxFQUFZLEVBQ1osUUFBZ0I7UUFFaEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekIsSUFBSSxNQUFNLEdBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsTUFBTSxTQUFTLEdBQW1CLEVBQUUsQ0FBQztRQUNyQyxPQUFPLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDdkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUM7WUFDeEQsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMvQyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekI7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0NBQ0Y7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxPQUE2QjtJQUN2RCxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO0lBQzVCLElBQUksT0FBTyxPQUFPLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRTtRQUN4QyxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUNoQztJQUNELE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqQyxNQUFNLE1BQU0sR0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsTUFBTSxLQUFLLEdBQVUsRUFBRSxDQUFDO0lBQ3hCLE9BQU8sTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUN4QyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxHQUFJLElBQWUsQ0FBQyxDQUFDO0tBQ3JFO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIn0=

@@ -1,5 +0,5 @@

import { DateLike } from './types';
import { DateLike } from "./types";
export declare function ms(date: Date | string): number;
export declare function DateLikeToString(d: DateLike): string;
export declare function DateLikeToTimestamp(d: DateLike): number;
export declare function getOrderOfMagnitude(n: number): number;
export declare function chunk(arr: any[], chunk_size: number): any[][];

@@ -5,9 +5,9 @@ export function ms(date) {

export function DateLikeToString(d) {
if (typeof d === 'string' && !isNaN(new Date(Number(d)).getTime())) {
return new Date(Number(d)).toISOString();
}
// if (typeof d === "string" && !isNaN(new Date(Number(d)).getTime())) {
// return new Date(Number(d)).toISOString();
// }
return new Date(d).toISOString();
}
export function DateLikeToTimestamp(d) {
if (typeof d === 'string' && !isNaN(new Date(Number(d)).getTime())) {
if (typeof d === "string" && !isNaN(new Date(Number(d)).getTime())) {
return new Date(Number(d)).getTime();

@@ -17,7 +17,7 @@ }

}
export function getOrderOfMagnitude(n) {
const order = Math.floor(Math.log(n) / Math.LN10 +
0.000000001); // because float math sucks like that
return Math.pow(10, order);
export function chunk(arr, chunk_size) {
return new Array(Math.ceil(arr.length / chunk_size))
.fill(0)
.map((_, i) => arr.slice(i * chunk_size, (i + 1) * chunk_size));
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sVUFBVSxFQUFFLENBQUUsSUFBbUI7SUFDckMsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtBQUNqQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFFLENBQVc7SUFDM0MsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRTtRQUNsRSxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO0tBQ3pDO0lBQ0QsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtBQUNsQyxDQUFDO0FBRUQsTUFBTSxVQUFVLG1CQUFtQixDQUFFLENBQVc7SUFDOUMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRTtRQUNsRSxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFBO0tBQ3JDO0lBQ0QsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtBQUM5QixDQUFDO0FBRUQsTUFBTSxVQUFVLG1CQUFtQixDQUFFLENBQVE7SUFDM0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJO1FBQzNCLFdBQVcsQ0FBQyxDQUFBLENBQUMscUNBQXFDO0lBQ3ZFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUE7QUFDNUIsQ0FBQyJ9
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sVUFBVSxFQUFFLENBQUMsSUFBbUI7SUFDcEMsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUNsQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLENBQVc7SUFDMUMsd0VBQXdFO0lBQ3hFLDhDQUE4QztJQUM5QyxJQUFJO0lBQ0osT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUNuQyxDQUFDO0FBRUQsTUFBTSxVQUFVLG1CQUFtQixDQUFDLENBQVc7SUFDN0MsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRTtRQUNsRSxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQ3RDO0lBQ0QsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUMvQixDQUFDO0FBRUQsTUFBTSxVQUFVLEtBQUssQ0FBQyxHQUFVLEVBQUUsVUFBa0I7SUFDbEQsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLENBQUM7U0FDakQsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUNQLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBQzVFLENBQUMifQ==

@@ -1,3 +0,15 @@

# 📦 0.1.3 (16 Nov 2022)
# 📦 0.1.3 (28 Dec 2022)
- [fcdd7](https://github.com/fatmatto/timeframes/commit/fcdd7973eaaa8006b3fbff20868c972025457011) chore(release): 0.1.37
- [796cf](https://github.com/fatmatto/timeframes/commit/796cf3319bc2a133ae1d7cc506f2761dd4da7821) chore: drop tests for node 14
- [5ffcd](https://github.com/fatmatto/timeframes/commit/5ffcd3cb60b17f37665f7bafa1d78cb04852f000) feat: move to rome tools, add split() method
- [a13d0](https://github.com/fatmatto/timeframes/commit/a13d04156cdad193c62fc8353702bef478024b36) doc: update docs
- [5f7cf](https://github.com/fatmatto/timeframes/commit/5f7cf594f75efc62d2578728a1f18c9fb28b2982) docs: improve doc template
- [9db5b](https://github.com/fatmatto/timeframes/commit/9db5b379c421a8551af82ef3eef9824d6a2ecce0) docs: fix docs path
- [c9788](https://github.com/fatmatto/timeframes/commit/c9788f9d07a4d7cf4b4bdc3961de79cac168af24) docs: add .nojekyll
- [c1a3b](https://github.com/fatmatto/timeframes/commit/c1a3b04fe2b6e16713ae8936a3bc5d28e3da506e) docs: add params to docsify
- [8d184](https://github.com/fatmatto/timeframes/commit/8d18461696a5620bfa518fdf74bb16737ae39f22) perf: use rb-tree for timeframe indexing
- [9547c](https://github.com/fatmatto/timeframes/commit/9547cdbd21da915d81e3315df4404e8424a7d957) chore: migrate docs to docsify
- [6b7c0](https://github.com/fatmatto/timeframes/commit/6b7c0c9ee23f3a588cc97e35205f2a94e65ac0ba) 📦 Release 0.1.35 standard-version [skip ci]
- [8c367](https://github.com/fatmatto/timeframes/commit/8c367b565436e3f908bc9ba2f05f08132a90802f) chore(release): 0.1.35
- [62dd3](https://github.com/fatmatto/timeframes/commit/62dd3016b6cb0d2468a2f244291e7c095d7ad678) feat: add TimeFrame.pipeline method; fix timeserie reducers behaviour with NaNsw
- [f6013](https://github.com/fatmatto/timeframes/commit/f601353bebc459db53d2625ca6a0f9b56d62b923) refactor: TimeFrame.aggregate() no longer takes arrays

@@ -4,0 +16,0 @@ - [a2408](https://github.com/fatmatto/timeframes/commit/a24080727cf00bd6848c1430c424bc052d1b9e67) 📦 Release 0.1.33 standard-version [skip ci]

{
"name": "@apio/timeframes",
"version": "0.1.35",
"version": "0.1.37",
"description": "Library for dealing with timeseries data",

@@ -18,7 +18,4 @@ "main": "build/main/index.js",

"build:module": "tsc -p tsconfig.module.json",
"fix": "run-s fix:*",
"fix:prettier": "prettier \"src/**/*.ts\" --write",
"fix:lint": "eslint src --ext .ts --fix",
"test": "run-s build test:*",
"test:lint": "eslint src --ext .ts",
"lint": "npx rome check src/**/*.ts",
"test:unit": "nyc ava --fail-fast",

@@ -35,3 +32,3 @@ "check-cli": "run-s test diff-integration-tests check-integration-tests",

"cov:check": "nyc report && nyc check-coverage --lines 100 --functions 100 --branches 100",
"doc": "npx typedoc --out docs src/**/*.ts",
"doc": "bash scripts/build-docs-website.sh",
"doc:json": "typedoc --json docs/docs.json src/**/*.ts",

@@ -50,4 +47,2 @@ "doc:publish": "gh-pages -m \"[ci skip] Updates\" -d docs",

"@types/node": "^18.8.5",
"@typescript-eslint/eslint-plugin": "^5.40.0",
"@typescript-eslint/parser": "^5.40.0",
"ava": "^4.3.3",

@@ -58,10 +53,2 @@ "codecov": "^3.5.0",

"doctrine": "^3.0.0",
"eslint": "^8.25.0",
"eslint-config-prettier": "^6.11.0",
"eslint-config-standard": "^17.0.0",
"eslint-plugin-eslint-comments": "^3.2.0",
"eslint-plugin-functional": "^3.0.2",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-n": "^15.3.0",
"eslint-plugin-promise": "^6.1.0",
"gh-pages": "^3.1.0",

@@ -71,3 +58,3 @@ "npm-run-all": "^4.1.5",

"open-cli": "^7.1.0",
"prettier": "^2.1.1",
"rome": "^11.0.0",
"standard-version": "^9.0.0",

@@ -117,4 +104,7 @@ "ts-node": "^9.0.0",

"dependencies": {
"parse-duration": "^1.0.2"
"@types/functional-red-black-tree": "^1.0.1",
"functional-red-black-tree": "^1.0.1",
"parse-duration": "^1.0.2",
"timsort": "^0.3.0"
}
}

@@ -5,4 +5,4 @@

<p align="center">
<strong>Library for dealing with timeseries data</strong>
<div align="center"> ⚠️ This is a work in progress</div>
<strong>Dataframe-like API for timeseries-like data</strong>
<div align="center"> ⚠️ This is still a work in progress</div>
</p>

@@ -22,3 +22,9 @@

![Timeseries](images/timeserie.png?raw=true "Timeseries")
```javascript
import { TimeSerie } from '@apio/timeframes'
// Pass an array of points

@@ -36,4 +42,6 @@ // a point is a tuple [DateLike, PointValue]

![Timeframes](images/timeframe.png?raw=true "Timeframes")
```javascript
import { TimeFrame } from '@apio/timeframes'
// Each item is a row

@@ -40,0 +48,0 @@ const rows = [

@@ -1,16 +0,46 @@

import { TimeSerie } from './timeserie'
import { AggregationConfiguration, DateLike, FromTimeseriesOptions, Index, Metadata, Point, PointValue, ReindexOptions, Row, TelemetryV1Output, TimeFrameInternal, PartitionOptions, TimeFrameResampleOptions, TimeframeRowsIterator, TimeInterval, TimeserieIterator, TimeFrameReduceOptions, ProjectionOptions, PipelineStage, PipelineStageType } from './types'
import { getOrderOfMagnitude } from './utils'
import { Tree } from "functional-red-black-tree";
import { TimeSerie } from "./timeserie";
import {
AggregationConfiguration,
DateLike,
FromTimeseriesOptions,
Index,
Metadata,
Point,
ReindexOptions,
Row,
TelemetryV1Output,
TimeFrameInternal,
PartitionOptions,
TimeFrameResampleOptions,
TimeframeRowsIterator,
TimeInterval,
TimeserieIterator,
TimeFrameReduceOptions,
ProjectionOptions,
PipelineStage,
PipelineStageType,
SplitOptions,
BetweenTimeOptions,
} from "./types";
import { chunk, DateLikeToString } from "./utils";
const test = (r, f, t, includeSuperior, includeInferior) => {
if (includeInferior && includeSuperior) {
return r >= f && r <= t
return r >= f && r <= t;
} else if (includeInferior && !includeSuperior) {
return r >= f && r < t
return r >= f && r < t;
} else if (!includeInferior && includeSuperior) {
return r > f && r <= t
return r > f && r <= t;
} else {
return r > f && r < t
return r > f && r < t;
}
};
interface TimeFrameIndexes {
time: DateLike[];
tree: Tree<DateLike, DateLike>;
}
const makeTree = require("functional-red-black-tree");
interface TimeFrameOptions {

@@ -25,6 +55,7 @@ data: Row[];

export class TimeFrame {
private readonly data: TimeFrameInternal = {}
columnNames: string[] = []
metadata: Metadata = {}
private _indexes: any
private readonly data: TimeFrameInternal = {};
columnNames: string[] = [];
metadata: Metadata = {};
private _indexes: TimeFrameIndexes;
private _columns: Record<string, TimeSerie> = {};

@@ -36,29 +67,38 @@ /**

*/
constructor (options: TimeFrameOptions) {
const { data, metadata = {} } = options
constructor(options: TimeFrameOptions) {
const { data, metadata = {} } = options;
// get a list of unique column names excluding the time key
this.metadata = metadata
this.metadata = metadata;
if (data.length === 0) {
this.data = {}
this.columnNames = []
this.data = {};
this.columnNames = [];
} else {
this.columnNames = [...new Set(data
.filter((row: any) => !!row)
.map((row: Row) => Object.keys(row))
.flat())]
.filter((name: string) => name !== 'time')
this.columnNames = [
...new Set(
data
.filter((row: Row) => !!row)
.flatMap((row: Row) => Object.keys(row)),
),
].filter((name: string) => name !== "time");
this.data = data
.concat([])
.filter((row: any) => !!row)
.filter((row: Row) => !!row)
.sort((a, b) => {
const ta = new Date(a.time).getTime()
const tb = new Date(b.time).getTime()
if (ta >= tb) { return 1 } else { return -1 }
const ta = new Date(a.time).getTime();
const tb = new Date(b.time).getTime();
if (ta >= tb) {
return 1;
} else {
return -1;
}
})
.reduce((acc: TimeFrameInternal, row: Row) => {
const { time, ...rest } = row
acc[row.time] ? acc[row.time] = { ...acc[row.time], ...rest } : acc[row.time] = rest
return acc
}, {})
const { time, ...rest } = row;
const fTime = DateLikeToString(time);
acc[fTime]
? (acc[fTime] = { ...acc[fTime], ...rest })
: (acc[fTime] = rest);
return acc;
}, {});
}

@@ -68,14 +108,16 @@

time: Object.keys(this.data).sort(),
checkpoints: null
}
tree: null,
};
}
private buildTimeCheckpoints () {
if (!this._indexes.checkpoints) {
this._indexes.checkpoints = {}
const o = getOrderOfMagnitude(this._indexes.time.length)
this._indexes.time.forEach((el, i) => {
if (i % (o / 100) === 0) { this._indexes.checkpoints[el] = i }
})
private buildTimeTree() {
if (!this._indexes.tree) {
let tree = makeTree(function (a: number, b: number) {
return a - b;
});
this._indexes.time.forEach((time: string) => {
const t = new Date(time).getTime();
tree = tree.insert(t, t);
});
this._indexes.tree = tree;
}

@@ -85,8 +127,8 @@ }

/**
* Creates a new timeframe preserving the metadata but replacing data
* @param data The new data to recreate the serie from
* @returns
*/
recreate (data: Row[]): TimeFrame {
return new TimeFrame({ data, metadata: this.metadata })
* Creates a new timeframe preserving the metadata but replacing data
* @param data The new data to recreate the serie from
* @returns
*/
recreate(data: Row[]): TimeFrame {
return new TimeFrame({ data, metadata: this.metadata });
}

@@ -99,6 +141,6 @@

*/
recreateFromSeries (series: TimeSerie[]) {
const tf = TimeFrame.fromTimeseries(series)
tf.metadata = this.metadata
return tf
recreateFromSeries(series: TimeSerie[]) {
const tf = TimeFrame.fromTimeseries(series);
tf.metadata = this.metadata;
return tf;
}

@@ -113,13 +155,17 @@

*/
reindex (index : Index, options?: ReindexOptions) : TimeFrame {
return this.recreate(index.map((i:string) => this.atTime(i) || options.fill || { time: i }))
reindex(index: Index, options?: ReindexOptions): TimeFrame {
return this.recreate(
index.map((i: string) => this.atTime(i) || options.fill || { time: i }),
);
}
/**
*
* Creates a TimeFrame from a Telemetry Output Object (Apio private method)
* @param data An object which is telemetry V1 output (Apio Internal)
* @returns
*/
static fromTelemetryV1Output (data: TelemetryV1Output = {}, metadata: Metadata = {}): TimeFrame {
const _data: TimeFrameInternal = {}
static fromTelemetryV1Output(
data: TelemetryV1Output = {},
metadata: Metadata = {},
): TimeFrame {
const _data: TimeFrameInternal = {};
for (const deviceId in data) {

@@ -129,10 +175,10 @@ for (const propertyName in data[deviceId]) {

if (!_data[time]) {
_data[time] = {}
_data[DateLikeToString(time)] = {};
}
const column = `${deviceId}:${propertyName}`
const column = `${deviceId}:${propertyName}`;
metadata[column] = {
deviceId,
propertyName
}
_data[time][column] = value
propertyName,
};
_data[DateLikeToString(time)][column] = value;
}

@@ -142,31 +188,40 @@ }

const rows = Object.keys(_data).map((time: string) => {
return { time, ..._data[time] }
})
return new TimeFrame({ data: rows, metadata })
return { time, ..._data[DateLikeToString(time)] };
});
return new TimeFrame({ data: rows, metadata });
}
static fromInternalFormat (data: TimeFrameInternal, metadata?: Metadata): TimeFrame {
private static fromInternalFormat(
data: TimeFrameInternal,
metadata?: Metadata,
): TimeFrame {
const _data: Row[] = Object.keys(data).map((time: string) => {
return { time, ...data[time] }
})
return new TimeFrame({ data: _data, metadata })
return { time, ...data[time] };
});
return new TimeFrame({ data: _data, metadata });
}
/**
*
* Returns a new TimeFrame, where each input timeserie is used as column
* @param timeseries An array of TimeSerie objects
* @param options.fill Value to use as filler when a column does not hold a value for a specific time
* @returns A new TimeFrame, where each timeserie represent a column
*/
static fromTimeseries (timeseries: TimeSerie[], options?: FromTimeseriesOptions): TimeFrame {
const data: TimeFrameInternal = {}
const metadata: Metadata = {}
timeseries.forEach(ts => {
metadata[ts.name] = ts.metadata
ts.toArray().forEach((point: Point) => {
data[point[0]] = data[point[0]] || {}
data[point[0]][ts.name] = point[1] || options?.fill || null
})
})
return TimeFrame.fromInternalFormat(data, metadata)
static fromTimeseries(
timeseries: TimeSerie[],
options?: FromTimeseriesOptions,
): TimeFrame {
const data: TimeFrameInternal = {};
const metadata: Metadata = {};
const idx = [...new Set(timeseries.flatMap((ts) => ts.indexes()))];
timeseries.forEach((ts) => {
metadata[ts.name] = ts.metadata;
});
idx.forEach((i: DateLike) => {
data[i as string] = {};
timeseries.forEach(
(ts) =>
(data[i as string][ts.name] = ts.atTime(i) || options?.fill || null),
);
});
return TimeFrame.fromInternalFormat(data, metadata);
}

@@ -179,10 +234,22 @@

*/
static concat (timeframes: TimeFrame[]) : TimeFrame {
static concat(timeframes: TimeFrame[]): TimeFrame {
return new TimeFrame({
metadata: Object.assign({}, ...timeframes.map(tf => tf.metadata)),
data: timeframes.map((tf: TimeFrame) => tf.rows()).flat()
})
metadata: Object.assign({}, ...timeframes.map((tf) => tf.metadata)),
data: timeframes.flatMap((tf: TimeFrame) => tf.rows()),
});
}
/**
* Merges together rows and columns of the specified timeframes.
* If two or more timeframes present a value for the same column at the same time, the first timeframe in the array has priority.
* @param timeframes Array of timeframes to merge
*/
static merge(timeframes: TimeFrame[]): TimeFrame {
if (timeframes.length < 2) {
throw new Error("merge() requires at least two timeframes");
}
return timeframes[0].join(timeframes.slice(1));
}
/**
* Joins multiple timeframes by adding the columns together and merging indexes (time)

@@ -192,4 +259,20 @@ * @param timeframes Array of timeframes to join together

*/
join (timeframes: TimeFrame[]): TimeFrame {
return TimeFrame.fromInternalFormat(Object.assign({}, ...(timeframes.map(tf => tf.data).concat([this.data]))))
join(timeframes: TimeFrame[]): TimeFrame {
const allTf = timeframes.concat([this]);
// Todo should support a filler value, at the moment it just does not define values in rows
// when a row misses a certain column's value
// const allColumns: string[] = [
// ...new Set(allTf.flatMap((tf) => tf.columnNames)),
// ];
const mergedIndex = [...new Set(allTf.flatMap((tf) => tf.indexes()))];
const rows = mergedIndex.map((idx: DateLike) => ({
time: idx,
...allTf
.map((tf) => tf.atTime(idx as string))
.reduce(
(prev, acc) => Object.assign(acc, prev),
this.atTime(idx as string),
),
}));
return this.recreate(rows);
}

@@ -202,34 +285,49 @@

*/
addColumn (serie: TimeSerie): TimeFrame {
return this.recreateFromSeries(this.columns().concat([serie]))
addColumn(serie: TimeSerie): TimeFrame {
return this.recreateFromSeries(this.columns().concat([serie]));
}
/**
*
* Returns the column as timeseries
* @param name The name of the wanted column
* @returns The column as timeseries
*/
column (name: string): TimeSerie {
column(name: string): TimeSerie {
if (!this.columnNames.includes(name)) {
return null
return null;
}
const data: Point[] = Object.entries(this.data).map(([time, values]) => ([time, values[name]]))
const metadata = this.metadata[name] || {}
return new TimeSerie(name, data, metadata)
// we cache the column to make subsequent reads faster
if (!this._columns[name]) {
const data: Point[] = Object.entries(this.data).map(([time, values]) => [
time,
values[name],
]);
const metadata = this.metadata[name] || {};
this._columns[name] = new TimeSerie(name, data, metadata);
}
return this._columns[name];
}
columns (): TimeSerie[] {
return this.columnNames.map((column: string) => this.column(column))
/**
* Returns every column as array of timeseries
*/
columns(): TimeSerie[] {
return this.columnNames.map((column: string) => this.column(column));
}
/**
*
* @returns Array of rows
* Returns all the rows in an array
*/
rows (): Row[] {
return Object.entries(this.data).map(([time, values]) => ({ time, ...values }))
rows(): Row[] {
return Object.entries(this.data).map(([time, values]) => ({
time,
...values,
}));
}
indexes (): DateLike[] {
return this._indexes.time
/**
* Returns the time index array
*/
indexes(): DateLike[] {
return this._indexes.time;
}

@@ -240,59 +338,69 @@

*/
project (config: ProjectionOptions): TimeFrame {
const nonExisting = config.columns.filter((name: string) => !this.columnNames.includes(name))
if (nonExisting.length > 0) { throw new Error(`Non existing columns ${nonExisting.join(',')}`) }
const tf = TimeFrame.fromTimeseries(config.columns.map((columnName: string) => this.column(columnName)))
tf.metadata = this.metadata
return tf
project(config: ProjectionOptions): TimeFrame {
const nonExisting = config.columns.filter(
(name: string) => !this.columnNames.includes(name),
);
if (nonExisting.length > 0) {
throw new Error(`Non existing columns ${nonExisting.join(",")}`);
}
const tf = TimeFrame.fromTimeseries(
config.columns.map((columnName: string) => this.column(columnName)),
);
tf.metadata = this.metadata;
return tf;
}
/**
*
* Returns a row at a given time or null
* @param time
* @returns A row at a given time or null
*/
atTime (time: string): Row | null {
return { time, ...this.data[time] } || null
atTime(time: string): Row | null {
return { time, ...this.data[DateLikeToString(time)] } || null;
}
/**
*
* @returns The row at the given index (position, not time)
* Get the row at the given index (position, not time)
*/
atIndex (index: number): PointValue {
atIndex(index: number): Row {
if (index >= this.rows().length) {
throw new Error('Index out of bounds')
throw new Error("Index out of bounds");
}
return this.rows()[index]
return this.rows()[index];
}
length (): number {
return this._indexes.time.length
/**
* Returns the number of rows
*/
length(): number {
return this._indexes.time.length;
}
/**
* Returns the shape of the timeframe
* @returns Array<Number> The shape of the timeframe expressed as [rows, columns] where columns excludes the time column
* Returns the shape of the timeframe expressed as [rows, columns] where columns excludes the time column
*/
shape (): number[] {
return [this._indexes.time.length, this.columnNames.length]
shape(): number[] {
return [this._indexes.time.length, this.columnNames.length];
}
/**
*
* @returns The first row
*/
first (): Row {
if (this.length() === 0) { return null }
return this.rows()?.[0] || null
*
* Returns the first row
*/
first(): Row {
if (this.length() === 0) {
return null;
}
return this.rows()?.[0] || null;
}
/**
*
* @returns The last row
*/
last (): Row {
if (this.length() === 0) { return null }
const t = this.rows()
return t?.[t.length - 1] || null
*
* Returns the last row
*/
last(): Row {
if (this.length() === 0) {
return null;
}
const t = this.rows();
return t?.[t.length - 1] || null;
}

@@ -303,6 +411,14 @@

*/
sum (): Row {
if (this.length() === 0) { return null }
const time = this.first().time
return this.columns().reduce((acc, column) => { acc[column.name] = column.sum()[1]; return acc }, { time })
sum(): Row {
if (this.length() === 0) {
return null;
}
const time = this.first().time;
return this.columns().reduce(
(acc, column) => {
acc[column.name] = column.sum()[1];
return acc;
},
{ time },
);
}

@@ -313,6 +429,14 @@

*/
avg (): Row {
if (this.length() === 0) { return null }
const time = this.first().time
return this.columns().reduce((acc, column) => { acc[column.name] = column.avg()[1]; return acc }, { time })
avg(): Row {
if (this.length() === 0) {
return null;
}
const time = this.first().time;
return this.columns().reduce(
(acc, column) => {
acc[column.name] = column.avg()[1];
return acc;
},
{ time },
);
}

@@ -323,6 +447,14 @@

*/
delta (): Row {
if (this.length() === 0) { return null }
const time = this.first().time
return this.columns().reduce((acc, column) => { acc[column.name] = column.delta()[1]; return acc }, { time })
delta(): Row {
if (this.length() === 0) {
return null;
}
const time = this.first().time;
return this.columns().reduce(
(acc, column) => {
acc[column.name] = column.delta()[1];
return acc;
},
{ time },
);
}

@@ -333,6 +465,14 @@

*/
max (): Row {
if (this.length() === 0) { return null }
const time = this.first().time
return this.columns().reduce((acc, column) => { acc[column.name] = column.max()[1]; return acc }, { time })
max(): Row {
if (this.length() === 0) {
return null;
}
const time = this.first().time;
return this.columns().reduce(
(acc, column) => {
acc[column.name] = column.max()[1];
return acc;
},
{ time },
);
}

@@ -343,6 +483,14 @@

*/
min (): Row {
if (this.length() === 0) { return null }
const time = this.first().time
return this.columns().reduce((acc, column) => { acc[column.name] = column.min()[1]; return acc }, { time })
min(): Row {
if (this.length() === 0) {
return null;
}
const time = this.first().time;
return this.columns().reduce(
(acc, column) => {
acc[column.name] = column.min()[1];
return acc;
},
{ time },
);
}

@@ -353,6 +501,6 @@

*/
add (value: number) : TimeFrame {
add(value: number): TimeFrame {
return this.recreateFromSeries(
this.columns().map((c:TimeSerie) => c.add(value))
)
this.columns().map((c: TimeSerie) => c.add(value)),
);
}

@@ -363,48 +511,42 @@

*/
mul (value: number) : TimeFrame {
mul(value: number): TimeFrame {
return this.recreateFromSeries(
this.columns().map((c:TimeSerie) => c.mul(value))
)
this.columns().map((c: TimeSerie) => c.mul(value)),
);
}
/**
*
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
* @returns The subset of points between the two dates. Extremes are included.
*/
betweenTime (from: DateLike, to: DateLike, options = { includeInferior: true, includeSuperior: true }): TimeFrame {
* Returns the subset of points between the two dates. Extremes are included.
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
*/
betweenTime(
from: DateLike,
to: DateLike,
options: BetweenTimeOptions = {
includeInferior: true,
includeSuperior: true,
},
): TimeFrame {
/**
* Here we might have to scan a huge sorted array. To prevent scanning too many useless keys
* we index the array by mapping a certain number of timestamps to positions in the time index.
*
* This sparse index is smaller than the full index and fester to use for scanning ranges like in this case.
* Here we might have to scan a huge sorted array. To prevent scanning too many useless keys. To get better performances we index timestamps with a RBtree in the buildTimeTree funciton
*/
this.buildTimeCheckpoints()
const { includeInferior, includeSuperior } = options
const f = new Date(from).getTime()
const t = new Date(to).getTime()
this.buildTimeTree();
const { includeInferior, includeSuperior } = options;
const f = new Date(from).getTime();
const t = new Date(to).getTime();
const keys = Object.keys(this._indexes.checkpoints)
// Indice della prima chiave che va oltre il from
const startingPointValueIndex = keys.findIndex((key) => new Date(key).getTime() > from)
// Ultimo timestamp prima di quell'indice
let startingPoint = this._indexes.checkpoints[keys[startingPointValueIndex - 1]]
if (!startingPoint) {
// Siamo oltre l'ultimo checkpoint
const lastCheckpoint = keys[keys.length - 1]
startingPoint = this._indexes.checkpoints[lastCheckpoint]
}
const goodRows = []
for (let i = startingPoint; i < this._indexes.time.length; i++) {
const curr = new Date(this._indexes.time[i]).getTime()
if (curr < f) { continue }
if (curr > t) {
break
const goodRows = [];
const iter = this._indexes.tree.ge(f);
while (iter && new Date(iter.key).getTime() <= t) {
if (test(iter.key, f, t, includeSuperior, includeInferior)) {
goodRows.push({
time: new Date(iter.key).toISOString(),
...this.data[DateLikeToString(iter.key)],
});
}
if (test(curr, f, t, includeSuperior, includeInferior)) {
goodRows.push({ time: this._indexes.time[i], ...this.data[this._indexes.time[i]] })
}
iter.next();
}
return this.recreate(goodRows)
return this.recreate(goodRows);
}

@@ -423,19 +565,30 @@

* tf = tf.aggregate({ output: 'power1', columns: ['voltage1', 'current1'], operation: 'mul' })
* .aggregate({ output: 'power', columns: ['power1', 'power2', 'power3'], operation: 'add'})
* .aggregate({ output: 'power', columns: ['power1', 'power2', 'power3'], operation: 'add'})
*/
aggregate (agg: AggregationConfiguration): TimeFrame {
aggregate(agg: AggregationConfiguration): TimeFrame {
const columnsToAggregate: TimeSerie[] = agg.columns
.filter((colName:string) => this.columnNames.includes(colName))
.map((colName: string) => this.column(colName))
.filter((colName: string) => this.columnNames.includes(colName))
.map((colName: string) => this.column(colName));
let newColumn : TimeSerie
if (typeof agg.operation === 'function') {
newColumn = TimeSerie.internals.combine(columnsToAggregate, agg.operation, { name: agg.output })
} else if (typeof agg.operation === 'string' && agg.operation in TimeSerie.internals.combiners) {
newColumn = TimeSerie.internals.combine(columnsToAggregate, TimeSerie.internals.combiners[agg.operation], { name: agg.output })
let newColumn: TimeSerie;
if (typeof agg.operation === "function") {
newColumn = TimeSerie.internals.combine(
columnsToAggregate,
agg.operation,
{ name: agg.output },
);
} else if (
typeof agg.operation === "string" &&
agg.operation in TimeSerie.internals.combiners
) {
newColumn = TimeSerie.internals.combine(
columnsToAggregate,
TimeSerie.internals.combiners[agg.operation],
{ name: agg.output },
);
} else {
throw new Error('Wrong type for aggregation operation')
throw new Error("Wrong type for aggregation operation");
}
return this.recreateFromSeries([newColumn].concat(this.columns()))
return this.recreateFromSeries([newColumn].concat(this.columns()));
}

@@ -451,24 +604,31 @@

*/
reduce (options: TimeFrameReduceOptions): TimeFrame {
return this.recreateFromSeries(this.columns().map((column:TimeSerie) => {
if (options.operations && column.name in options.operations) {
return column.recreate([column[options.operations[column.name]]()])
} else {
return column.recreate([column[options.operation]()])
}
}))
reduce(options: TimeFrameReduceOptions): TimeFrame {
return this.recreateFromSeries(
this.columns().map((column: TimeSerie) => {
if (options.operations && column.name in options.operations) {
return column.recreate([column[options.operations[column.name]]()]);
} else {
return column.recreate([column[options.operation]()]);
}
}),
);
}
resample (options: TimeFrameResampleOptions): TimeFrame {
const from = options.from || this.first()?.time
/**
* Resamples the timeframe by the specified time interval. Each row
* of the result TimeFrame will be the result of the selected aggregation.
* @param options
*/
resample(options: TimeFrameResampleOptions): TimeFrame {
const from = options.from || this.first()?.time;
if (!from) {
throw new Error('Cannot infer a lower bound for resample')
throw new Error("Cannot infer a lower bound for resample");
}
const to = options.to || this.last()?.time
const to = options.to || this.last()?.time;
if (!to) {
throw new Error('Cannot infer an upper bound for resample')
throw new Error("Cannot infer an upper bound for resample");
}
return TimeFrame.concat(this.partition(options)
.map((chunk: TimeFrame) => chunk.reduce(options))
)
return TimeFrame.concat(
this.partition(options).map((chunk: TimeFrame) => chunk.reduce(options)),
);
}

@@ -481,13 +641,19 @@

*/
filter (fn: TimeframeRowsIterator): TimeFrame {
return new TimeFrame({ data: this.rows().filter(fn), metadata: this.metadata })
filter(fn: TimeframeRowsIterator): TimeFrame {
return new TimeFrame({
data: this.rows().filter(fn),
metadata: this.metadata,
});
}
/**
* Returns a new timeframe where each **row** is mapped by the iterator function. For mapping over columns, use apply()
* @param fn Iterator function
* @returns {TimeFrame}
*/
map (fn: TimeframeRowsIterator): TimeFrame {
return new TimeFrame({ data: this.rows().map(fn), metadata: this.metadata })
* Returns a new timeframe where each **row** is mapped by the iterator function. For mapping over columns, use apply()
* @param fn Iterator function
* @returns {TimeFrame}
*/
map(fn: TimeframeRowsIterator): TimeFrame {
return new TimeFrame({
data: this.rows().map(fn),
metadata: this.metadata,
});
}

@@ -501,9 +667,14 @@

*/
apply (fn: TimeserieIterator, columns: string[] = this.columnNames): TimeFrame {
const unmodifiedColumns = this.columnNames.filter((columnName: string) => !columns.includes(columnName)).map((columnName: string) => this.column(columnName))
apply(
fn: TimeserieIterator,
columns: string[] = this.columnNames,
): TimeFrame {
const unmodifiedColumns = this.columnNames
.filter((columnName: string) => !columns.includes(columnName))
.map((columnName: string) => this.column(columnName));
const series: TimeSerie[] = columns
.map((columnName: string) => (this.column(columnName)))
.map(fn)
.map((columnName: string) => this.column(columnName))
.map(fn);
return TimeFrame.fromTimeseries(unmodifiedColumns.concat(series))
return TimeFrame.fromTimeseries(unmodifiedColumns.concat(series));
}

@@ -514,30 +685,44 @@

* @param options
* @returns
*/
partition (options: PartitionOptions): TimeFrame[] {
const from = options.from || this.first()?.time
partition(options: PartitionOptions): TimeFrame[] {
const from = options.from || this.first()?.time;
if (!from) {
throw new Error('Cannot infer a lower bound for resample')
throw new Error("Cannot infer a lower bound for resample");
}
const to = options.to || this.last()?.time
const to = options.to || this.last()?.time;
if (!to) {
throw new Error('Cannot infer an upper bound for resample')
throw new Error("Cannot infer an upper bound for resample");
}
const intervals = TimeInterval.generate(from, to, options.interval)
const intervals = TimeInterval.generate(from, to, options.interval);
const partitions = intervals.map((interval: TimeInterval) => {
return this.betweenTime(interval.from, interval.to, { includeInferior: true, includeSuperior: false })
})
return this.betweenTime(interval.from, interval.to, {
includeInferior: true,
includeSuperior: false,
});
});
return partitions.map((p: TimeFrame, idx: number) => {
if (p.length() === 0) {
return p.recreate([{ time: intervals[idx].from.toISOString() }])
return p.recreate([{ time: intervals[idx].from.toISOString() }]);
} else if (p.first().time !== intervals[idx].from.toISOString()) {
return p.recreate([{ time: intervals[idx].from.toISOString() }].concat(p.rows()))
return p.recreate(
[{ time: intervals[idx].from.toISOString() }].concat(p.rows()),
);
} else {
return p
return p;
}
})
});
}
/**
* Splits a timeframe into multiple timeframes where each timeframe has
* a maximum of `options.chunks` rows.
*/
split(options: SplitOptions): TimeFrame[] {
return chunk(this.rows(), options.chunks).map((rows: Row[]) =>
this.recreate(rows),
);
}
/**
* Runs a series of transformations defined as an object. Useful in automation.

@@ -547,7 +732,7 @@ * A stage is an object with a single key and a value, the key is the name of the method, the value is the params object

*/
pipeline (stages: PipelineStage[]) {
return stages.reduce((tf:TimeFrame, stage: PipelineStage) => {
const fn: PipelineStageType = Object.keys(stage)[0] as PipelineStageType
return tf[fn](stage[fn] as any)
}, this)
pipeline(stages: PipelineStage[]) {
return stages.reduce((tf: TimeFrame, stage: PipelineStage) => {
const fn: PipelineStageType = Object.keys(stage)[0] as PipelineStageType;
return tf[fn](stage[fn] as any);
}, this);
}

@@ -558,5 +743,5 @@

*/
print () {
console.table(this.rows())
print() {
console.table(this.rows());
}
}

@@ -1,23 +0,47 @@

import { createIndex, DateLike, FromIndexOptions, Index, Metadata, PartitionOptions, Point, PointValue, ReindexOptions, ResampleOptions, TimeInterval, TimeseriePointCombiner, TimeseriePointIterator, TimeSerieReduceOptions, TimeSeriesOperationOptions } from './types'
import { DateLikeToString } from './utils'
import {
BetweenTimeOptions,
createIndex,
DateLike,
FromIndexOptions,
Index,
Metadata,
PartitionOptions,
Point,
PointValue,
ReindexOptions,
ResampleOptions,
SplitOptions,
TimeInterval,
TimeseriePointCombiner,
TimeseriePointIterator,
TimeSerieReduceOptions,
TimeSeriesOperationOptions,
} from "./types";
import { chunk, DateLikeToString } from "./utils";
function isNumeric (str: string | number): boolean {
if (typeof str === 'number') return !isNaN(str)
if (typeof str !== 'string') return false // we only process strings!
return !isNaN(str as any) && // use type coercion to parse the _entirety_ of the string (`parseFloat` alone does not do this)...
!isNaN(parseFloat(str)) // ...and ensure strings of whitespace fail
import * as Timsort from "timsort";
function isNumeric(str: string | number): boolean {
if (typeof str === "number") return !isNaN(str);
if (typeof str !== "string") return false; // we only process strings!
return (
!isNaN(str as any) && // use type coercion to parse the _entirety_ of the string (`parseFloat` alone does not do this)...
!isNaN(parseFloat(str))
); // ...and ensure strings of whitespace fail
}
function sortPoints (points: Point[] | ReadonlyArray<Point>) {
return [].concat(points).sort((a: Point, b: Point) => {
function sortPoints(points: Point[] | ReadonlyArray<Point>) {
const arr = [].concat(points);
Timsort.sort(arr, (a: Point, b: Point) => {
if (a[0] > b[0]) {
return 1
return 1;
} else {
return -1
return -1;
}
})
});
return arr;
}
function normalizePoint (p: Point): Point {
return [DateLikeToString(p[0]), p[1]]
function normalizePoint(p: Point): Point {
return [DateLikeToString(p[0]), p[1]];
}

@@ -29,24 +53,47 @@

export class TimeSerie {
public static internals: any = {}
public static createIndex: Function
readonly data: Point[]
name: string
metadata: Metadata
index: {[key: string] : PointValue}
constructor (name: string, serie: Point[] | ReadonlyArray<Point>, metadata: Metadata = {}) {
this.data = sortPoints(serie).map(normalizePoint)
this.name = name
this.metadata = metadata
this.index = [].concat(this.data).reduce((acc: any, p:Point) => {
acc[p[0]] = p
return acc
}, {})
public static internals: any = {};
public static createIndex: Function;
readonly data: Point[];
name: string;
metadata: Metadata;
index: { [key: string]: PointValue };
/**
* Creates a new timeserie.
* @param name {String} The name of the serie
* @param serie {Point[]} The points in the serie
* @param metadata {Metadata} Optional metadata
*/
constructor(
name: string,
serie: Point[] | ReadonlyArray<Point>,
metadata: Metadata = {},
) {
this.data = sortPoints(serie).map(normalizePoint);
this.name = name;
this.metadata = metadata;
this.index = []
.concat(this.data)
.reduce((acc: { [key: string]: PointValue }, p: Point) => {
acc[p[0]] = p;
return acc;
}, {});
}
static fromIndex (index: Index, options: FromIndexOptions) : TimeSerie {
return new TimeSerie(options.name, index.map((i: string) => ([i, options?.fill || null])), options.metadata)
/**
* Creates a new TimeSerie from the given Index. The new serie's values are all set to `null` unless `options.fill` is passed.
* @param index
* @param options
*/
static fromIndex(index: Index, options: FromIndexOptions): TimeSerie {
return new TimeSerie(
options.name,
index.map((i: string) => [i, options?.fill || null]),
options.metadata,
);
}
/**
* Recreates the serie's index
* Recreates the serie's index according to `options` and returns the reindexed serie.
*
* @param index The new index to use. Can be created with createIndex()

@@ -57,8 +104,16 @@ * @see createIndex

*/
reindex (index : Index, options?: ReindexOptions) : TimeSerie {
reindex(index: Index, options?: ReindexOptions): TimeSerie {
if (options.mergeIndexes === true) {
const idx = [...new Set(this.indexes().concat(index))]
return new TimeSerie(this.name, idx.map((i: string) => ([i, this.atTime(i) || options?.fill || null])), this.metadata)
const idx = [...new Set(this.indexes().concat(index))];
return new TimeSerie(
this.name,
idx.map((i: string) => [i, this.atTime(i) || options?.fill || null]),
this.metadata,
);
}
return new TimeSerie(this.name, index.map((i: string) => ([i, this.atTime(i) || options?.fill || null])), this.metadata)
return new TimeSerie(
this.name,
index.map((i: string) => [i, this.atTime(i) || options?.fill || null]),
this.metadata,
);
}

@@ -68,11 +123,15 @@

*
* @returns Array of points, where each point is a tuple with ISO8601 timestamp and value
* Returns the array of points, where each point is a tuple with ISO8601 timestamp and value
*/
toArray () {
return this.data
toArray() {
return this.data;
}
rename (name: string) {
this.name = name
return this
/**
* Updates (in place) the serie's name. **This method does NOT return a new timeserie**.
* @param name
*/
rename(name: string) {
this.name = name;
return this;
}

@@ -85,4 +144,4 @@

*/
recreate (serie: Point[] | ReadonlyArray<Point>) {
return new TimeSerie(this.name, serie, this.metadata)
recreate(serie: Point[] | ReadonlyArray<Point>) {
return new TimeSerie(this.name, serie, this.metadata);
}

@@ -92,6 +151,6 @@

*
* @returns The array of time indexes
* Returns the array of time indexes
*/
indexes (): DateLike[] {
return this.data.map((p: Point) => p[0])
indexes(): DateLike[] {
return this.data.map((p: Point) => p[0]);
}

@@ -101,6 +160,6 @@

*
* @returns The array of values
* Returns the array of values
*/
values (): PointValue[] {
return this.data.map((p: Point) => p[1])
values(): PointValue[] {
return this.data.map((p: Point) => p[1]);
}

@@ -111,4 +170,8 @@

*/
static concat (series:TimeSerie[]) : TimeSerie {
return new TimeSerie(series[0].name, series.map(serie => serie.toArray()).flat(), Object.assign({}, ...series.map(serie => serie.metadata)))
static concat(series: TimeSerie[]): TimeSerie {
return new TimeSerie(
series[0].name,
series.flatMap((serie) => serie.toArray()),
Object.assign({}, ...series.map((serie) => serie.metadata)),
);
}

@@ -118,12 +181,15 @@

*
* @returns The time of the latest non-NaN value
* Returns the time of the latest non-NaN value
*/
lastValidIndex (): string | null {
const result = this.data.concat([]).reverse().find((point: Point) => {
return !!point[1]
})
lastValidIndex(): string | null {
const result = this.data
.concat([])
.reverse()
.find((point: Point) => {
return !!point[1];
});
if (result) {
return result[0]
return result[0];
} else {
return null
return null;
}

@@ -134,12 +200,12 @@ }

*
* @returns The time of the first non-NaN value
* Returns the time of the first non-NaN value
*/
firstValidIndex (): string | null {
firstValidIndex(): string | null {
const result = this.data.find((point: Point) => {
return !!point[1]
})
return !!point[1];
});
if (result) {
return result[0]
return result[0];
} else {
return null
return null;
}

@@ -149,13 +215,15 @@ }

/**
*
* @returns The latest non-NaN value
* Returns the latest non-NaN value
*/
lastValidValue (): PointValue {
const result = this.data.concat([]).reverse().find((point: Point) => {
return !!point[1]
})
lastValidValue(): PointValue {
const result = this.data
.concat([])
.reverse()
.find((point: Point) => {
return !!point[1];
});
if (result) {
return result[1]
return result[1];
} else {
return null
return null;
}

@@ -165,13 +233,12 @@ }

/**
*
* @returns The first non-NaN value
* Returns the first non-NaN value
*/
firstValidValue (): PointValue {
firstValidValue(): PointValue {
const result = this.data.find((point: Point) => {
return !!point[1]
})
return !!point[1];
});
if (result) {
return result[1]
return result[1];
} else {
return null
return null;
}

@@ -181,7 +248,7 @@ }

/**
*
* @returns {PointValue} The value of the timeseries at the given time
* Returns the value of the timeseries at the given time
* @returns {PointValue}
*/
atTime (time: DateLike, fillValue: number = null): PointValue {
return this.index?.[DateLikeToString(time)]?.[1] || fillValue
atTime(time: DateLike, fillValue: number = null): PointValue {
return this.index?.[DateLikeToString(time)]?.[1] || fillValue;
}

@@ -191,103 +258,152 @@

*
* @returns The value at the given index (position, not time)
* Returns the value at the given index.
*/
atIndex (index: number): PointValue {
atIndex(index: number): PointValue {
if (index >= this.data.length) {
throw new Error('Index out of bounds')
throw new Error("Index out of bounds");
}
return this.data[index][1]
return this.data[index][1];
}
/**
* Returns the subset of points between the two dates. Extremes are included.
*
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
* @returns The subset of points between the two dates. Extremes are included.
*/
betweenTime (from: DateLike, to: DateLike, options = { includeInferior: true, includeSuperior: true }) {
const { includeInferior, includeSuperior } = options
const f = new Date(from)
const t = new Date(to)
betweenTime(
from: DateLike,
to: DateLike,
options: BetweenTimeOptions = {
includeInferior: true,
includeSuperior: true,
},
) {
const { includeInferior, includeSuperior } = options;
const f = new Date(from);
const t = new Date(to);
const data: Point[] = this.data.filter((point: Point) => {
if (includeInferior && includeSuperior) {
return new Date(point[0]).getTime() >= f.getTime() && new Date(point[0]).getTime() <= t.getTime()
return (
new Date(point[0]).getTime() >= f.getTime() &&
new Date(point[0]).getTime() <= t.getTime()
);
} else if (includeInferior && !includeSuperior) {
return new Date(point[0]).getTime() >= f.getTime() && new Date(point[0]).getTime() < t.getTime()
return (
new Date(point[0]).getTime() >= f.getTime() &&
new Date(point[0]).getTime() < t.getTime()
);
} else if (!includeInferior && includeSuperior) {
return new Date(point[0]).getTime() > f.getTime() && new Date(point[0]).getTime() <= t.getTime()
return (
new Date(point[0]).getTime() > f.getTime() &&
new Date(point[0]).getTime() <= t.getTime()
);
} else {
return new Date(point[0]).getTime() > f.getTime() && new Date(point[0]).getTime() < t.getTime()
return (
new Date(point[0]).getTime() > f.getTime() &&
new Date(point[0]).getTime() < t.getTime()
);
}
})
return this.recreate(data)
});
return this.recreate(data);
}
/**
*
* @param from start positional index
* @param to end positional index
* @returns The subset of points between the two indexes. Extremes are included.
*/
betweenIndexes (from: number, to: number) {
return this.filter((_: Point, i: number) => { return i >= from && i <= to })
* Returns the subset of points between the two indexes. Extremes are included.
*
* @param from start positional index
* @param to end positional index
*/
betweenIndexes(from: number, to: number) {
return this.filter((_: Point, i: number) => {
return i >= from && i <= to;
});
}
filter (fn: TimeseriePointIterator) {
return this.recreate(this.data.filter(fn))
/**
* Builds a new serie by applying a filter function the current serie's points
* @params fn {Function}
*/
filter(fn: TimeseriePointIterator) {
return this.recreate(this.data.filter(fn));
}
map (fn: TimeseriePointIterator) {
return this.recreate(this.data.map(fn))
/**
* Builds a new serie by applying a map function the current serie's points
* @param fn {Function}
*/
map(fn: TimeseriePointIterator) {
return this.recreate(this.data.map(fn));
}
length (): number {
return this.data.length
/**
* Returns the number of points in the serie.
*/
length(): number {
return this.data.length;
}
isEmpty (): boolean {
return this.data.length === 0
/**
* Returns true if the serie has 0 points
*/
isEmpty(): boolean {
return this.data.length === 0;
}
copy (): TimeSerie {
return new TimeSerie(this.name, this.data, this.metadata)
/**
* Copies the serie to a new serie
*/
copy(): TimeSerie {
return new TimeSerie(this.name, this.data, this.metadata);
}
sum (): Point {
/**
* Returns the sum of the values in the serie
*/
sum(): Point {
if (this.length() === 0) {
return [null, null]
return [null, null];
}
const copy = this.dropNaN()
return [this.first()[0], copy.data.map((p: Point) => p[1]).reduce((p1: number, p2: number) => p1 + p2, 0)]
const copy = this.dropNaN();
let tot = 0;
const l = copy.length();
const data = copy.toArray();
for (let i = l - 1; i >= 0; i--) {
tot += data[i][1];
}
return [this.first()[0], tot];
}
/**
*
* @returns The average of point values
* Returns the average of the values in the serie
*/
avg (): Point {
avg(): Point {
if (this.length() === 0) {
return [null, null]
return [null, null];
}
const copy = this.dropNaN()
return [this.first()[0], copy.sum()[1] / copy.length()]
const copy = this.dropNaN();
return [this.first()[0], copy.sum()[1] / copy.length()];
}
delta (): Point {
/**
* Returns the difference between the last and the first element by performing last value - first value.
*/
delta(): Point {
if (this.length() <= 0) {
return [null, null]
return [null, null];
}
const copy = this.dropNaN()
const copy = this.dropNaN();
if (copy.length() === 1) {
return copy.data[0][1]
return copy.data[0][1];
}
return [this.first()[0], copy.last()[1] - copy.first()[1]]
return [this.first()[0], copy.last()[1] - copy.first()[1]];
}
/**
* Returns the first point
*
* @returns The firstfirst point
*/
first (): Point {
return this.data[0] || null
first(): Point {
return this.data[0] || null;
}

@@ -298,6 +414,7 @@

* @param time
* @returns
*/
firstAt (time: DateLike): Point {
return this.data.find((p: Point) => { return new Date(p[0]).getTime() >= new Date(time).getTime() })
firstAt(time: DateLike): Point {
return this.data.find((p: Point) => {
return new Date(p[0]).getTime() >= new Date(time).getTime();
});
}

@@ -307,6 +424,6 @@

*
* @returns The last point
* Returns the last point
*/
last (): Point {
return this.data[this.length() - 1] || null
last(): Point {
return this.data[this.length() - 1] || null;
}

@@ -316,12 +433,15 @@

*
* @returns The point with max value, or null
* Returns the point with max value, or null
*/
max (): Point | null {
max(): Point | null {
if (this.length() === 0) {
return [null, null]
return [null, null];
}
if (this.length() === 1) {
return this.data[0]
return this.data[0];
}
return this.data.reduce((prev, current) => current[1] > prev[1] ? current : prev, this.data[0])
return this.data.reduce(
(prev, current) => (current[1] > prev[1] ? current : prev),
this.data[0],
);
}

@@ -331,12 +451,15 @@

*
* @returns The point with min value or null
* Returns the point with min value or null
*/
min (): Point | null {
min(): Point | null {
if (this.length() === 0) {
return [null, null]
return [null, null];
}
if (this.length() === 1) {
return this.data[0]
return this.data[0];
}
return this.data.reduce((prev, current) => current[1] < prev[1] ? current : prev, this.data[0])
return this.data.reduce(
(prev, current) => (current[1] < prev[1] ? current : prev),
this.data[0],
);
}

@@ -347,4 +470,4 @@

*/
reduce (options: TimeSerieReduceOptions): TimeSerie {
return this.recreate([this[options.operation]()])
reduce(options: TimeSerieReduceOptions): TimeSerie {
return this.recreate([this[options.operation]()]);
}

@@ -355,125 +478,196 @@

* @param options
* @returns
*/
partition (options: PartitionOptions): TimeSerie[] {
const from = options.from || this.first()?.[0]
partition(options: PartitionOptions): TimeSerie[] {
const from = options.from || this.first()?.[0];
if (!from) {
throw new Error('Cannot infer a lower bound for resample')
throw new Error("Cannot infer a lower bound for resample");
}
const to = options.to || this.last()?.[0]
const to = options.to || this.last()?.[0];
if (!to) {
throw new Error('Cannot infer an upper bound for resample')
throw new Error("Cannot infer an upper bound for resample");
}
const intervals = TimeInterval.generate(from, to, options.interval)
const intervals = TimeInterval.generate(from, to, options.interval);
const partitions = intervals.map((interval: TimeInterval) => {
return this.betweenTime(interval.from, interval.to, { includeInferior: true, includeSuperior: false })
})
return this.betweenTime(interval.from, interval.to, {
includeInferior: true,
includeSuperior: false,
});
});
return partitions.map((p: TimeSerie, idx: number) => {
if (p.length() === 0) {
return p.recreate([[intervals[idx].from.toISOString(), null]])
return p.recreate([[intervals[idx].from.toISOString(), null]]);
} else if (p.first()[0] !== intervals[idx].from.toISOString()) {
const newPoint : Point = [intervals[idx].from.toISOString(), null]
return p.recreate([newPoint].concat(p.toArray()))
const newPoint: Point = [intervals[idx].from.toISOString(), null];
return p.recreate([newPoint].concat(p.toArray()));
} else {
return p
return p;
}
})
});
}
/**
* Splits a timeserie into multiple timeseries where each timeserie has
* a maximum of `options.chunks` points.
*/
split(options: SplitOptions): TimeSerie[] {
return chunk(this.toArray(), options.chunks).map((points: Point[]) => {
return this.recreate(points);
});
}
/**
* Resample the timeserie using a new time interval and a point aggregation function
* @param options
* @returns
*/
resample (options: ResampleOptions): TimeSerie {
const from = options.from || this.first()[0]
resample(options: ResampleOptions): TimeSerie {
const from = options.from || this.first()[0];
if (!from) {
throw new Error('Cannot infer a lower bound for resample')
throw new Error("Cannot infer a lower bound for resample");
}
const to = options.to || this.last()[0]
const to = options.to || this.last()[0];
if (!to) {
throw new Error('Cannot infer an upper bound for resample')
throw new Error("Cannot infer an upper bound for resample");
}
return TimeSerie.concat(this.partition(options)
.map((chunk: TimeSerie) => chunk.reduce(options)))
return TimeSerie.concat(
this.partition(options).map((chunk: TimeSerie) => chunk.reduce(options)),
);
}
removeAt (time: DateLike): TimeSerie {
return this.recreate(this.data.filter((p: Point) => { return p[0] !== DateLikeToString(time) }))
/**
* Remove the point at the given time and returns a new serie
*/
removeAt(time: DateLike): TimeSerie {
return this.recreate(
this.data.filter((p: Point) => {
return p[0] !== DateLikeToString(time);
}),
);
}
removeAtIndex (index: number): TimeSerie {
return this.recreate(this.data.filter((_: Point, i: number) => { return i !== index }))
/**
* Remove the point at the given index and returns a new serie
*/
removeAtIndex(index: number): TimeSerie {
return this.recreate(
this.data.filter((_: Point, i: number) => {
return i !== index;
}),
);
}
/**
*
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
* @returns New timeserie without the removed data. Bounds are removed.
*/
removeBetweenTime (from: DateLike, to: DateLike) {
const f = new Date(from)
const t = new Date(to)
* Returns the new timeserie without the removed data. Bounds are removed.
*
* @param from start date string in ISO8601 format
* @param to end date string in ISO8601 format
*/
removeBetweenTime(from: DateLike, to: DateLike) {
const f = new Date(from);
const t = new Date(to);
const data = this.data.filter((point: Point) => {
return new Date(point[0]).getTime() < f.getTime() || new Date(point[0]).getTime() > t.getTime()
})
return this.recreate(data)
return (
new Date(point[0]).getTime() < f.getTime() ||
new Date(point[0]).getTime() > t.getTime()
);
});
return this.recreate(data);
}
dropNaN () : TimeSerie {
return this.filter((p: Point) => isNumeric(p[1]))
/**
* Removes points with NaN value from the serie
*/
dropNaN(): TimeSerie {
return this.filter((p: Point) => isNumeric(p[1]));
}
dropNull () {
return this.filter((p: Point) => p[1] !== null)
/**
* Removes points with null value from the serie.
*/
dropNull() {
return this.filter((p: Point) => p[1] !== null);
}
/**
*
* Rounds the serie's points.
* @param decimals {Number} the number of decimals to keep
* @returns {TimeSerie}
*/
round (decimals: number) {
return this.map((p: Point) => ([p[0], Number(Number(p[1]).toFixed(decimals))]))
round(decimals: number) {
return this.map((p: Point) => [
p[0],
Number(Number(p[1]).toFixed(decimals)),
]);
}
// Operation between timeseries
combine (operation:string, series: TimeSerie[], options: TimeSeriesOperationOptions = {}) : TimeSerie {
options.name = options.name || this.name
options.metadata = options.metadata || this.metadata
return TimeSerie.internals.combine([this.recreate(this.data)].concat(series), TimeSerie.internals.combiners[operation], options)
/**
* Combine the current serie with an array of series y performing combination operations, such as multiplication, addition ecc.
* @param operation {string}
* @param series {TimeSerie[]}
* @param options {TimeSeriesOperationOptions}
*/
combine(
operation: string,
series: TimeSerie[],
options: TimeSeriesOperationOptions = {},
): TimeSerie {
options.name = options.name || this.name;
options.metadata = options.metadata || this.metadata;
return TimeSerie.internals.combine(
[this.recreate(this.data)].concat(series),
TimeSerie.internals.combiners[operation],
options,
);
}
add (value: number | TimeSerie): TimeSerie {
if (typeof value === 'number') {
return this.map((point:Point) => [point[0], point[1] + value])
/**
* Adds values to the timeserie. If a scalar is passed, its value is added to every point in the serie. If another serie
* is passed, the two series are combined by addition.
* @see combine
*/
add(value: number | TimeSerie): TimeSerie {
if (typeof value === "number") {
return this.map((point: Point) => [point[0], point[1] + value]);
} else {
return this.combine('add', [value])
return this.combine("add", [value]);
}
}
sub (value: number | TimeSerie): TimeSerie {
if (typeof value === 'number') {
return this.map((point:Point) => [point[0], point[1] - value])
/**
* Subtracts values from the timeserie. If a scalar is passed, its value is subtracted from every point in the serie. If another serie
* is passed, the two series are combined by subtraction.
* @see combine
*/
sub(value: number | TimeSerie): TimeSerie {
if (typeof value === "number") {
return this.map((point: Point) => [point[0], point[1] - value]);
} else {
return this.combine('sub', [value])
return this.combine("sub", [value]);
}
}
mul (value: number | TimeSerie): TimeSerie {
if (typeof value === 'number') {
return this.map((point:Point) => [point[0], point[1] * value])
/**
* Multiplies values of the timeserie. If a scalar is passed, every point in the serie is multiplied times that value. If another serie
* is passed, the two series are combined by multiplication.
* @see combine
*/
mul(value: number | TimeSerie): TimeSerie {
if (typeof value === "number") {
return this.map((point: Point) => [point[0], point[1] * value]);
} else {
return this.combine('mul', [value])
return this.combine("mul", [value]);
}
}
div (value: number | TimeSerie): TimeSerie {
if (typeof value === 'number') {
return this.map((point:Point) => [point[0], point[1] / value])
/**
* Divides values of the timeserie. If a scalar is passed, every point in the serie is divided by that value. If another serie
* is passed, the two series are combined by division.
* @see combine
*/
div(value: number | TimeSerie): TimeSerie {
if (typeof value === "number") {
return this.map((point: Point) => [point[0], point[1] / value]);
} else {
return this.combine('div', [value])
return this.combine("div", [value]);
}

@@ -486,21 +680,31 @@ }

// Restituisce la funzione
TimeSerie.internals = {}
TimeSerie.internals.combiners = {}
TimeSerie.internals.combine = (series: TimeSerie[], combiner: TimeseriePointCombiner, options: TimeSeriesOperationOptions) : TimeSerie => {
const points = series[0].data.map((p: Point) => p[0]).map((idx: string) => {
const values = series.map((serie:TimeSerie) => serie.atTime(idx, options.fill))
return [
idx,
combiner(values, idx)
] as Point
})
return new TimeSerie(options.name, points, options.metadata)
}
TimeSerie.internals = {};
TimeSerie.internals.combiners = {};
TimeSerie.internals.combine = (
series: TimeSerie[],
combiner: TimeseriePointCombiner,
options: TimeSeriesOperationOptions,
): TimeSerie => {
const points = series[0].data
.map((p: Point) => p[0])
.map((idx: string) => {
const values = series.map((serie: TimeSerie) =>
serie.atTime(idx, options.fill),
);
return [idx, combiner(values, idx)] as Point;
});
return new TimeSerie(options.name, points, options.metadata);
};
TimeSerie.internals.combiners.add = (points: PointValue[]) => points.reduce((a:PointValue, b:PointValue) => a + b, 0)
TimeSerie.internals.combiners.sub = (points: PointValue[]) => points.reduce((a:PointValue, b:PointValue) => a - b, points[0] * 2)
TimeSerie.internals.combiners.mul = (points: PointValue[]) => points.reduce((a:PointValue, b:PointValue) => a * b, 1)
TimeSerie.internals.combiners.div = (points: PointValue[]) => points.reduce((a:PointValue, b:PointValue) => a / b, points[0] * points[0])
TimeSerie.internals.combiners.avg = (points: PointValue[]) => (TimeSerie.internals.combiners.add(points) / points.length)
TimeSerie.internals.combiners.add = (points: PointValue[]) =>
points.reduce((a: PointValue, b: PointValue) => a + b, 0);
TimeSerie.internals.combiners.sub = (points: PointValue[]) =>
points.reduce((a: PointValue, b: PointValue) => a - b, points[0] * 2);
TimeSerie.internals.combiners.mul = (points: PointValue[]) =>
points.reduce((a: PointValue, b: PointValue) => a * b, 1);
TimeSerie.internals.combiners.div = (points: PointValue[]) =>
points.reduce((a: PointValue, b: PointValue) => a / b, points[0] * points[0]);
TimeSerie.internals.combiners.avg = (points: PointValue[]) =>
TimeSerie.internals.combiners.add(points) / points.length;
TimeSerie.createIndex = createIndex
TimeSerie.createIndex = createIndex;

@@ -1,5 +0,5 @@

import parse from 'parse-duration'
import { TimeSerie } from './timeserie'
import parse from "parse-duration";
import { TimeSerie } from "./timeserie";
export type PointValue = number | string | boolean | any
export type PointValue = number | string | boolean | any;

@@ -10,20 +10,20 @@ export type DateLike = Date | string | number;

*/
export type Point = readonly [string, PointValue]
export type Point = readonly [string, PointValue];
export interface TelemetryV1OutputProperty {
[propertyName: string]: readonly Point[]
};
[propertyName: string]: readonly Point[];
}
export interface TelemetryV1Output {
[id: string]: TelemetryV1OutputProperty
};
[id: string]: TelemetryV1OutputProperty;
}
export type Metadata = {
[key: string]: any
}
[key: string]: any;
};
export type TimeFrameInternalRow = {
[columnName: string]: PointValue
}
[columnName: string]: PointValue;
};
export type TimeFrameInternal = {
[time: string]: TimeFrameInternalRow
}
[time: string]: TimeFrameInternalRow;
};

@@ -36,5 +36,5 @@ export interface TimeSeriesOperationOptions {

export interface FromIndexOptions {
name: string
metadata?: Metadata
fill?: PointValue
name: string;
metadata?: Metadata;
fill?: PointValue;
}

@@ -46,7 +46,7 @@

export interface Row {
readonly time: string
readonly [x: string]: unknown
};
readonly time: string;
readonly [x: string]: unknown;
}
export type Index = string[]
export type Index = string[];

@@ -56,3 +56,7 @@ /**

*/
export type TimeseriePointIterator = (value: Point, index: number, array: ReadonlyArray<Point>) => any
export type TimeseriePointIterator = (
value: Point,
index: number,
array: ReadonlyArray<Point>,
) => any;

@@ -62,3 +66,6 @@ /**

*/
export type TimeseriePointCombiner = (values: PointValue[], index: DateLike) => PointValue
export type TimeseriePointCombiner = (
values: PointValue[],
index: DateLike,
) => PointValue;

@@ -68,3 +75,7 @@ /**

*/
export type TimeframeRowsIterator = (value: Row, index: number, array: ReadonlyArray<Row>) => any
export type TimeframeRowsIterator = (
value: Row,
index: number,
array: ReadonlyArray<Row>,
) => any;

@@ -74,6 +85,17 @@ /**

*/
export type TimeserieIterator = (value: TimeSerie, index: number, array: ReadonlyArray<TimeSerie>) => any
export type TimeserieIterator = (
value: TimeSerie,
index: number,
array: ReadonlyArray<TimeSerie>,
) => any;
export type ColumnAggregation = 'avg' | 'last' | 'first' | 'min' | 'max' | 'delta' | 'sum'
export type ResampleDefaultAggregation = ColumnAggregation
export type ColumnAggregation =
| "avg"
| "last"
| "first"
| "min"
| "max"
| "delta"
| "sum";
export type ResampleDefaultAggregation = ColumnAggregation;

@@ -84,9 +106,9 @@ export type IntervalOptions = {

to?: DateLike;
}
};
export type TimeSerieReduceOptions = {
operation: ColumnAggregation
}
operation: ColumnAggregation;
};
export type PartitionOptions = IntervalOptions
export type PartitionOptions = IntervalOptions;

@@ -96,7 +118,7 @@ export type ResampleOptions = IntervalOptions & {

dropNaN?: boolean;
}
};
export type TimeFrameResampleOptions = ResampleOptions & {
operations?: {[key: string]: ColumnAggregation};
}
operations?: { [key: string]: ColumnAggregation };
};

@@ -110,28 +132,41 @@ export interface IndexCreationOptions {

export interface ProjectionOptions {
columns: string[]
columns: string[];
}
export interface AggregationConfiguration {
output:string;
operation:'add' | 'mul' | 'div' | 'sub' | 'avg' | TimeseriePointCombiner;
columns: string[]
output: string;
operation: "add" | "mul" | "div" | "sub" | "avg" | TimeseriePointCombiner;
columns: string[];
}
export type ReduceOperation = 'min' | 'max' | 'first' | 'last' | 'avg' | 'sum' | 'delta'
export type ReduceOperation =
| "min"
| "max"
| "first"
| "last"
| "avg"
| "sum"
| "delta";
export type TimeFrameReduceOptions = {
operation: ReduceOperation
operations?: {[key:string]:ReduceOperation}
}
operation: ReduceOperation;
operations?: { [key: string]: ReduceOperation };
};
export interface FromTimeseriesOptions {
fill?: PointValue
fill?: PointValue;
}
export interface ReindexOptions {
fill?: PointValue
mergeIndexes?: boolean
fill?: PointValue;
mergeIndexes?: boolean;
}
export type PipelineStageType = 'aggregate' | 'resample' | 'project'| 'reduce'| 'add' | 'mul'
export type PipelineStageType =
| "aggregate"
| "resample"
| "project"
| "reduce"
| "add"
| "mul";
export type PipelineStage = {

@@ -144,25 +179,38 @@ aggregate?: AggregationConfiguration;

mul?: number;
}
};
export type SplitOptions = {
chunks: number;
};
export type BetweenTimeOptions = {
includeInferior: boolean;
includeSuperior: boolean;
};
export class TimeInterval {
from: Date
to: Date
size: number
constructor (from: Date, to: Date) {
this.from = from
this.to = to
this.size = to.getTime() - from.getTime()
from: Date;
to: Date;
size: number;
constructor(from: Date, to: Date) {
this.from = from;
this.to = to;
this.size = to.getTime() - from.getTime();
}
static generate (from: DateLike, to: DateLike, interval: number): TimeInterval[] {
const _to = new Date(to)
let cursor: Date = new Date(from)
const intervals: TimeInterval[] = []
static generate(
from: DateLike,
to: DateLike,
interval: number,
): TimeInterval[] {
const _to = new Date(to);
let cursor: Date = new Date(from);
const intervals: TimeInterval[] = [];
while (cursor.getTime() < _to.getTime()) {
const next = new Date(cursor)
next.setMilliseconds(next.getMilliseconds() + interval)
intervals.push(new TimeInterval(cursor, next))
cursor = new Date(next)
const next = new Date(cursor);
next.setMilliseconds(next.getMilliseconds() + interval);
intervals.push(new TimeInterval(cursor, next));
cursor = new Date(next);
}
return intervals
return intervals;
}

@@ -176,15 +224,15 @@ }

*/
export function createIndex (options: IndexCreationOptions): Index {
let size = options.interval
if (typeof options.interval === 'string') {
size = parse(options.interval)
export function createIndex(options: IndexCreationOptions): Index {
let size = options.interval;
if (typeof options.interval === "string") {
size = parse(options.interval);
}
const _to = new Date(options.to)
const cursor: Date = new Date(options.from)
const index: Index = []
const _to = new Date(options.to);
const cursor: Date = new Date(options.from);
const index: Index = [];
while (cursor.getTime() <= _to.getTime()) {
index.push(cursor.toISOString())
cursor.setMilliseconds(cursor.getMilliseconds() + (size as number))
index.push(cursor.toISOString());
cursor.setMilliseconds(cursor.getMilliseconds() + (size as number));
}
return index
return index;
}

@@ -1,25 +0,25 @@

import { DateLike } from './types'
import { DateLike } from "./types";
export function ms (date: Date | string): number {
return new Date(date).getTime()
export function ms(date: Date | string): number {
return new Date(date).getTime();
}
export function DateLikeToString (d: DateLike): string {
if (typeof d === 'string' && !isNaN(new Date(Number(d)).getTime())) {
return new Date(Number(d)).toISOString()
}
return new Date(d).toISOString()
export function DateLikeToString(d: DateLike): string {
// if (typeof d === "string" && !isNaN(new Date(Number(d)).getTime())) {
// return new Date(Number(d)).toISOString();
// }
return new Date(d).toISOString();
}
export function DateLikeToTimestamp (d: DateLike): number {
if (typeof d === 'string' && !isNaN(new Date(Number(d)).getTime())) {
return new Date(Number(d)).getTime()
export function DateLikeToTimestamp(d: DateLike): number {
if (typeof d === "string" && !isNaN(new Date(Number(d)).getTime())) {
return new Date(Number(d)).getTime();
}
return new Date(d).getTime()
return new Date(d).getTime();
}
export function getOrderOfMagnitude (n:number):number {
const order = Math.floor(Math.log(n) / Math.LN10 +
0.000000001) // because float math sucks like that
return Math.pow(10, order)
export function chunk(arr: any[], chunk_size: number) {
return new Array(Math.ceil(arr.length / chunk_size))
.fill(0)
.map((_, i: number) => arr.slice(i * chunk_size, (i + 1) * chunk_size));
}
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Packages

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc