UNPKG

@modelx/modelx

Version:

Construct AI & ML models with JSON using Typescript & Tensorflow

247 lines (238 loc) 9.76 kB
import { monthNumbers, weekNumbers, dayNumbers, quarterhourNumbers, ordinalDayNumbers, hourNumbers, minuteNumbers, secondNumbers, mockDates, getPartialHour, getQuarterHour, getParsedDate, getIsOutlier, getOpenHour, getLuxonDateTime, addMockDataToDataSet, removeMockDataFromDataSet, removeEvaluationData, } from './constants'; import { Info, DateTime, } from 'luxon'; import { DataSet, } from '@modelx/data/src/index'; import { getDatum, getData, generateNumberRange,randomNumber, } from './util'; // console.log({ mockDates }); describe('util', () => { describe('randomNumber', () => { it('should generate a random number in range', () => { const one_to_ten = randomNumber(1, 10); expect(one_to_ten).toBeLessThanOrEqual(10); expect(one_to_ten).toBeGreaterThanOrEqual(1); }); }); }); describe('constants', () => { describe('generated date objects', () => { it('should include all month numbers', () => { const luxonMonths = Info.months('numeric').map(monthString => parseInt(monthString)); expect(monthNumbers).toEqual(expect.arrayContaining(luxonMonths)); }); it('should include all week numbers', () => { expect(weekNumbers).toEqual(expect.arrayContaining(generateNumberRange(1,52))); // console.log({ weekNums,weekNumbers }); }); it('should include all oridinal day numbers', () => { const ordinals = generateNumberRange(1, 366); expect(ordinalDayNumbers).toEqual(expect.arrayContaining(ordinals)); }); it('should include all day numbers', () => { const days = generateNumberRange(1, 31); expect(dayNumbers).toEqual(expect.arrayContaining(days)); }); it('should include all quarter hour numbers', () => { const quarterHours = generateNumberRange(1, 96); expect(quarterhourNumbers).toEqual(expect.arrayContaining(quarterHours)); }); it('should include all hour numbers', () => { const hours = generateNumberRange(0, 23); expect(hourNumbers).toEqual(expect.arrayContaining(hours)); }); it('should include all minute numbers', () => { const minutes = generateNumberRange(0, 59); expect(minuteNumbers).toEqual(expect.arrayContaining(minutes)); }); it('should include all second numbers', () => { const seconds = generateNumberRange(0, 59); expect(secondNumbers).toEqual(expect.arrayContaining(seconds)); }); it('should include all mock dates', () => { expect(mockDates.length).toEqual(368); }); }); describe('getPartialHour', () => { it('should return the partial hour', () => { expect(getPartialHour(0)).toBe(1); expect(getPartialHour(10)).toBe(1); expect(getPartialHour(15)).toBe(2); expect(getPartialHour(16)).toBe(2); expect(getPartialHour(25)).toBe(2); expect(getPartialHour(29)).toBe(2); expect(getPartialHour(30)).toBe(3); expect(getPartialHour(31)).toBe(3); expect(getPartialHour(39)).toBe(3); expect(getPartialHour(44)).toBe(3); expect(getPartialHour(45)).toBe(4); expect(getPartialHour(48)).toBe(4); expect(getPartialHour(59)).toBe(4); expect(getPartialHour(60)).toBe(4); }); }); describe('getQuarterHour', () => { it('should return the quarter hour', () => { expect(getQuarterHour({hour:0,minute:0})).toBe(1); expect(getQuarterHour({hour:0,minute:1})).toBe(1); expect(getQuarterHour({hour:1,minute:1})).toBe(5); expect(getQuarterHour({hour:1,minute:59})).toBe(8); expect(() => { getQuarterHour({ hour: 1, }); }).toThrowError('both hour and minute are required'); }); }); describe('getParsedDate', () => { it('should return a parsed date object', () => { const pd = getParsedDate(new Date('2020-04-11T12:00'), {}); // console.log({ pd }) expect(pd.weekend).toBe(true); }); }); describe('getLuxonDateTime', () => { it('should return a Luxon.DateTime date and format js', () => { const options1 = { dateObject: new Date(), }; const options2 = { dateObject: new Date(), dateFormat: 'js', }; const options3 = { dateObject: new Date(), dateFormat: 'js', time_zone: 'America/Los_Angeles' }; const df1 = getLuxonDateTime(options1); const df2 = getLuxonDateTime(options2); const df3 = getLuxonDateTime(options3); // expect(df1.date).toBe(expect.any(DateTime)); // console.log({ df1: df1.date.toISO(), df2: df2.date.toISO(), df3: df3.date.toISO() }); expect(df1.format).toBe('js'); expect(df2.format).toBe('js'); expect(df3.format).toBe('js'); expect(df1.date).toBeInstanceOf(DateTime); expect(df2.date).toBeInstanceOf(DateTime); expect(df3.date).toBeInstanceOf(DateTime); }); it('should return a Luxon.DateTime date and format iso', () => { const options1 = { dateObject: '2020-04-09T14:30', dateFormat: 'iso', }; const options2 = { dateObject: new Date(), dateFormat: 'iso', time_zone: 'America/Los_Angeles' }; const df1 = getLuxonDateTime(options1); const df2 = getLuxonDateTime(options2); // expect(df1.date).toBe(expect.any(DateTime)); expect(df1.format).toBe('iso'); expect(df2.format).toBe('js'); expect(df1.date).toBeInstanceOf(DateTime); expect(df2.date).toBeInstanceOf(DateTime); }); it('should return a Luxon.DateTime date from custom format', () => { const options1 = { dateObject: 'Aug 06 2020', dateFormat: 'LLL dd yyyy', }; const options2 = { dateObject: 'Aug 06 2020', dateFormat: 'invalid', time_zone: 'America/Los_Angeles' }; const df1 = getLuxonDateTime(options1); const df2 = getLuxonDateTime(options2); // expect(df1.date).toBe(expect.any(DateTime)); // console.log({ // df1: df1.date, // }); // console.log({ // df1: df1.date.toISO(), // df2: df2.date.toISO(), // }); expect(df1.format).toBe(options1.dateFormat); expect(df2.format).toBe(options2.dateFormat); expect(df1.date).toBeInstanceOf(DateTime); expect(df2.date).toBeInstanceOf(DateTime); }); }); describe('getOpenHour', () => { it('should return return 1 if opwn', () => { expect(getOpenHour.call({})).toBe(1); }); }); describe('getIsOutlier', () => { it('should return 0 if no data to test', () => { expect(getIsOutlier.call({})).toBe(0); }); it('should return outliers', () => { const outlierData = [{ field: 12 }, { field: 14 }, { field: 51 }, { field: 12 }, { field: 10 }, { field: 9 }, { field: 16 },];//).testOutlier(51); // true expect(getIsOutlier.call({ datum: { field: 51 }, data:outlierData, }, { outlier_property:'field' })).toBe(1); expect(getIsOutlier.call({ datum: { field: 12 }, data:outlierData, }, { outlier_property:'field' })).toBe(-1); expect(getIsOutlier.call({ datum: { field: 12 }, data:outlierData, }, { })).toBe(0); }); }); describe('addMockDataToDataSet', () => { it('should add mock data', () => { const data = getData(2); const mockEncodedData = getData(1); // console.log({ mockDates }); // console.log('pre',{ data, mockEncodedData, }); const DS = new DataSet(data); const newDS = addMockDataToDataSet(DS, { mockEncodedData, includeConstants:false, }); // console.log('post',{ data }); // console.log('post DS data', { data: newDS.data, }); expect(newDS.data.length).toBe(data.length + mockEncodedData.length); }); it('should add mock dates as mock data', () => { const data = getData(2); const mockEncodedData = getData(1); const DS_for_mock_dates = new DataSet(data); const newDS_with_mock_dates = addMockDataToDataSet(DS_for_mock_dates, { mockEncodedData, includeConstants:true, }); expect(newDS_with_mock_dates.data.length).toBe(data.length + mockEncodedData.length + mockDates.length); }) }); describe('removeMockDataFromDataSet', () => { it('should remove mock data', () => { const data = getData(2); const mockEncodedData = getData(1); // console.log({ mockDates }); // console.log('pre',{ data, mockEncodedData, }); const DS = new DataSet(data.concat(mockEncodedData)); const newDS = removeMockDataFromDataSet(DS, { mockEncodedData, includeConstants:false, }); // console.log('post',{ data }); // console.log('post DS data', { data: newDS.data, }); expect(newDS.data.length).toBe(data.length); }); it('should remove mock dates and mock data', () => { const data = getData(2); const mockEncodedData = getData(1); const DS_for_mock_dates = new DataSet(data.concat(mockEncodedData,mockDates)); const newDS_with_mock_dates = removeMockDataFromDataSet(DS_for_mock_dates, { mockEncodedData, includeConstants:true, }); expect(newDS_with_mock_dates.data.length).toBe(data.length); }) }); describe('removeEvaluationData', () => { it('should remove evaluation data', () => { const evaluation = { actuals: [[1]], estimates: [[1]], otherval: 'dummy', }; removeEvaluationData(evaluation); expect(evaluation).not.toHaveProperty('actuals'); expect(evaluation).not.toHaveProperty('estimates'); expect(evaluation).toHaveProperty('otherval'); }); }); });