Last active
November 24, 2023 06:52
-
-
Save iswanj/f8c60786c45ee1ff754f9744ff029df3 to your computer and use it in GitHub Desktop.
calculate sum
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function addMonthlySumValues(data) { | |
return data.map(item => { | |
let result = {}; | |
for (const row of item.data) { | |
for (const keys in row) { | |
if (keys === 'date' || keys === 'datetime') continue; | |
if (keys in result) { | |
result[keys] += Number(row[keys].value) | |
} else { | |
result[keys] = Number(row[keys].value) | |
} | |
} | |
} | |
return { ...item, ...result}; | |
}) | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const dataset = [ | |
{ | |
Level: { | |
lvl1: { value: 2, datetime: '2023/09/22'}, | |
lvl2: { value: 2, datetime: '2023/09/22' }, | |
lvl3: { value: 2, datetime: '2023/09/22' }, | |
lvl4: { value: 2, datetime: '2023/09/22' } | |
}, | |
Density: { | |
density1: { value: 2, datetime: '2023/09/22' }, | |
density2: { value: 2, datetime: '2023/09/22' }, | |
density3: { value: 2, datetime: '2023/09/22' }, | |
density4: { value: 2, datetime: '2023/09/22' } | |
}, | |
Stock: { | |
stock1: { value: 2, datetime: '2023/09/22' }, | |
stock2: { value: 2, datetime: '2023/09/22' }, | |
stock3: { value: 2, datetime: '2023/09/22' }, | |
stock4: { value: 2, datetime: '2023/09/22' } | |
}, | |
Consumption: { | |
"kiln 2": { value: 2, datetime: '2023/09/22' }, | |
"kiln 3": { value: 2, datetime: '2023/09/22' }, | |
"kiln 6": { value: 2, datetime: '2023/09/22' }, | |
"RB 5": { value: 2, datetime: '2023/09/22' } | |
}, | |
TotalStock: { | |
value: { value: 2, datetime: '2023/09/22' } | |
}, | |
ConsumptionTotal: { | |
value: { value: 2, datetime: '2023/09/22' } | |
} | |
} | |
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const dataset = { | |
Level: { | |
kpiName: "Level", | |
uom: "%", | |
data: { | |
lvl1: [ | |
{ | |
pitag: 1, | |
value: 1, | |
datetime: "2023/09/22", | |
}, | |
{ | |
pitag: 1, | |
value: 1, | |
datetime: "2023/09/23", | |
} | |
], | |
lvl2: [ | |
{ | |
value: 1, | |
datetime: "2023/09/22", | |
}, | |
{ | |
value: 1, | |
datetime: "2023/09/23", | |
} | |
], | |
lvl3: [ | |
{ | |
value: 1, | |
datetime: "2023/09/22", | |
}, | |
{ | |
value: 1, | |
datetime: "2023/09/23", | |
} | |
], | |
lvl4: [ | |
{ | |
value: 1, | |
datetime: "2023/09/22", | |
}, | |
{ | |
value: 1, | |
datetime: "2023/09/23", | |
} | |
], | |
}, | |
}, | |
Density: { | |
kpiName: "Density", | |
uom: "kg/m³", | |
data: { | |
Density1: [ | |
{ | |
value: 1, | |
datetime: "2023/09/22", | |
}, | |
{ | |
value: 1, | |
datetime: "2023/09/23", | |
} | |
], | |
Density2: [ | |
{ | |
value: 1, | |
datetime: "2023/09/22", | |
}, | |
{ | |
value: 1, | |
datetime: "2023/09/23", | |
} | |
], | |
Density3: [ | |
{ | |
value: 1, | |
datetime: "2023/09/22", | |
}, | |
{ | |
value: 1, | |
datetime: "2023/09/23", | |
} | |
], | |
Density4: [ | |
{ | |
value: 1, | |
datetime: "2023/09/22", | |
}, | |
{ | |
value: 1, | |
datetime: "2023/09/23", | |
} | |
], | |
}, | |
}, | |
Consumption: { | |
kpiName: "Consumption", | |
uom: "Ton", | |
data: { | |
"Kiln 2": [ | |
{ | |
value: 1, | |
datetime: "2023/09/22", | |
}, | |
{ | |
value: 1, | |
datetime: "2023/09/23", | |
} | |
], | |
"Kiln 3": [ | |
{ | |
value: 1, | |
datetime: "2023/09/22", | |
}, | |
{ | |
value: 1, | |
datetime: "2023/09/23", | |
} | |
], | |
"Kiln 6": [ | |
{ | |
value: 1, | |
datetime: "2023/09/22", | |
}, | |
{ | |
value: 1, | |
datetime: "2023/09/23", | |
} | |
], | |
"RB 5": [ | |
{ | |
value: 1, | |
datetime: "2023/09/22", | |
}, | |
{ | |
value: 1, | |
datetime: "2023/09/23", | |
} | |
], | |
}, | |
}, | |
TotalStock: { | |
kpiName: "Total Stock In Tank", | |
uom: "Ton", | |
data: [ | |
{ | |
value: 1, | |
datetime: "2023/09/22", | |
}, | |
{ | |
value: 1, | |
datetime: "2023/09/23", | |
} | |
], | |
}, | |
ConsumptionTotal: { | |
kpiName: "Consumption Total", | |
uom: "Ton", | |
data: [ | |
{ | |
value: 2, | |
datetime: "2023/09/22", | |
}, | |
{ | |
value: 2, | |
datetime: "2023/09/23", | |
} | |
], | |
}, | |
Stock: { | |
kpiName: "Stock", | |
uom: "Ton", | |
data: { | |
stock1: [ | |
{ | |
value: 1, | |
datetime: "2023/09/22", | |
}, | |
{ | |
value: 1, | |
datetime: "2023/09/23", | |
} | |
], | |
stock2: [ | |
{ | |
value: 1, | |
datetime: "2023/09/22", | |
}, | |
{ | |
value: 1, | |
datetime: "2023/09/23", | |
} | |
], | |
stock3: [ | |
{ | |
value: 1, | |
datetime: "2023/09/22", | |
}, | |
{ | |
value: 1, | |
datetime: "2023/09/23", | |
} | |
], | |
stock4: [ | |
{ | |
value: 1, | |
datetime: "2023/09/22", | |
}, | |
{ | |
value: 1, | |
datetime: "2023/09/23", | |
} | |
], | |
}, | |
}, | |
}; | |
function generateKPIData(data, key, compiledData) { | |
const set = compiledData; | |
for (const row of data) { | |
//console.log(data) | |
if (row.datetime in set) { | |
set[row.datetime] = { | |
...set[row.datetime], | |
[key]: row | |
} | |
} else { | |
set[row.datetime] = { [key]: row }; | |
} | |
} | |
return set; | |
} | |
function transformData(originalData) { | |
let reformattedData = {}; | |
for(const lvlKey in originalData) { | |
const kpiData = originalData[lvlKey].data; | |
//console.log(kpiData); | |
if(!Array.isArray(kpiData)) { | |
for (const kpikey in kpiData) { | |
const rowdata = kpiData[kpikey] | |
//console.log(rowdata) | |
reformattedData = { | |
...reformattedData, | |
...generateKPIData(rowdata, kpikey, reformattedData) | |
} | |
// for (const data of rowdata) { | |
// //console.log(data) | |
// if (data.datetime in reformattedData) { | |
// reformattedData[data.datetime] = { | |
// ...reformattedData[data.datetime], | |
// [kpikey]: data | |
// } | |
// } else { | |
// reformattedData[data.datetime] = { [kpikey]: data }; | |
// } | |
// } | |
} | |
} else { | |
reformattedData = { | |
...reformattedData, | |
...generateKPIData(kpiData, lvlKey, reformattedData) | |
} | |
// for (const data of kpiData) { | |
// if (data.datetime in reformattedData) { | |
// reformattedData[data.datetime] = { | |
// ...reformattedData[data.datetime], | |
// [lvlKey]: data | |
// } | |
// } else { | |
// reformattedData[data.datetime] = { [lvlKey]: data }; | |
// } | |
// } | |
} | |
} | |
return reformattedData; | |
} | |
// Example usage: | |
const transformedData = transformData(dataset); | |
console.log(transformedData); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function groupDataByYearMonth(data) { | |
const groupedData = {}; | |
data.forEach(entry => { | |
// const date = moment(entry.datetime, 'YYYY/MM/DD'); | |
// const yearMonth = date.format('YYYY/MM'); | |
const date = new Date(entry.datetime); | |
const yearMonth = `${date.getFullYear()}/${(date.getMonth() + 1).toString().padStart(2, '0')}`; | |
if (!groupedData[yearMonth]) { | |
groupedData[yearMonth] = { year_month: yearMonth, data: [] }; | |
} | |
groupedData[yearMonth].data.push({ | |
datetime: entry.datetime, | |
lvl1: { | |
value: entry.lvl1.value, | |
datetime: entry.lvl1.datetime, | |
}, | |
}); | |
}); | |
return Object.values(groupedData); | |
} | |
const dataset = [ | |
{ | |
datetime: "2023/10/23", | |
lvl1: { | |
value: 1, | |
datetime: "202/10/23", | |
}, | |
}, | |
{ | |
datetime: "2023/10/24", | |
lvl1: { | |
value: 1, | |
datetime: "202/10/24", | |
}, | |
}, | |
{ | |
datetime: "2023/11/12", | |
lvl1: { | |
value: 1, | |
datetime: "202/10/12", | |
}, | |
}, | |
{ | |
datetime: "2023/10/14", | |
lvl1: { | |
value: 1, | |
datetime: "2023/10/14", | |
}, | |
}, | |
]; | |
const groupedData = groupDataByYearMonth(dataset); | |
console.log(groupedData); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function calculateSum(data) { | |
const result = {}; | |
for (const key in data) { | |
const rows = data[key]; | |
for (const row of rows) { | |
const { value, datetime } = row; | |
if (!result[datetime]) { | |
result[datetime] = 0; | |
} | |
result[datetime] += parseInt(value); | |
} | |
} | |
return result; | |
} | |
function convertToArray(data) { | |
return Object.keys(data).map(key => ({ | |
datetime: key, | |
value: data[key], | |
})); | |
} | |
// Function composition | |
const calculateAndConvert = data => convertToArray(calculateSum(data)); | |
// Example usage | |
console.log(calculateAndConvert(dataset)); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const dataset = { | |
Level: { | |
lvl1: [ | |
{ | |
pitag: "1", | |
value: "33", | |
datetime: "2023/09/22", | |
}, | |
{ | |
pitag: "1", | |
value: "33", | |
datetime: "2023/09/28", | |
}, | |
], | |
lvl2: [ | |
{ | |
pitag: "2", | |
value: "1", | |
datetime: "2023/09/22", | |
}, | |
{ | |
pitag: "2", | |
value: "3", | |
datetime: "2023/09/28", | |
}, | |
], | |
lvl3: [ | |
{ | |
pitag: "3", | |
value: "1", | |
datetime: "2023/09/22", | |
}, | |
{ | |
pitag: "3", | |
value: "3", | |
datetime: "2023/09/28", | |
}, | |
], | |
lvl4: [ | |
{ | |
pitag: "4", | |
value: "1", | |
datetime: "2023/09/22", | |
}, | |
{ | |
pitag: "4", | |
value: "3", | |
datetime: "2023/09/28", | |
}, | |
], | |
}, | |
Density: { | |
density1: [ | |
{ | |
pitag: "1", | |
value: "815", | |
datetime: "2023/09/22", | |
}, | |
{ | |
pitag: "1", | |
value: "815", | |
datetime: "2023/09/28", | |
}, | |
], | |
density2: [ | |
{ | |
pitag: "2", | |
value: "1", | |
datetime: "2023/09/22", | |
}, | |
{ | |
pitag: "2", | |
value: "3", | |
datetime: "2023/09/28", | |
}, | |
], | |
density3: [ | |
{ | |
pitag: "3", | |
value: "1", | |
datetime: "2023/09/22", | |
}, | |
{ | |
pitag: "3", | |
value: "3", | |
datetime: "2023/09/28", | |
}, | |
], | |
density4: [ | |
{ | |
pitag: "4", | |
value: "1", | |
datetime: "2023/09/22", | |
}, | |
{ | |
pitag: "4", | |
value: "3", | |
datetime: "2023/09/28", | |
}, | |
], | |
}, | |
}; | |
const staticValueMap = { | |
1: 14.5, | |
2: 14.5, | |
3: 10, | |
4: 10, | |
} | |
// Methanol tank1 level / 100 * tank1 Density / 1000 * 14.5 | |
const calculateStock = (lvlValue, densityValue, index) => { | |
return (lvlValue / 100 * densityValue / 1000 * staticValueMap[index+1]).toFixed(1); | |
} | |
function calculateSum(dataset) { | |
const densityLookup = Object.keys(dataset.Density).reduce((obj, d, i) => { | |
const values = dataset.Density[d].reduce((valueObj, item) => { | |
const key = `${i+1}-${item.datetime}`; | |
return { | |
...valueObj, | |
[key]: item.value | |
} | |
}, {}); | |
return { | |
...obj, | |
...values | |
} | |
}, {}); | |
return Object.keys(dataset.Level).reduce((lvlObj, lvl, i) => { | |
const levelData = dataset.Level[lvl]; | |
const lvlValues = levelData.reduce((valueArr, lvlValue) => { | |
const key = `${i+1}-${lvlValue.datetime}`; | |
return [ | |
...valueArr, | |
{ | |
datetime: lvlValue.datetime, | |
value: calculateStock(Number(lvlValue.value), Number(densityLookup[key]), i) | |
} | |
] | |
}, []) | |
return { | |
...lvlObj, | |
[`stock${i + 1}`]: lvlValues | |
} | |
}, {}) | |
} | |
const calculatedDataset = calculateSum(dataset); | |
console.log(calculatedDataset); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment