Skip to content

Instantly share code, notes, and snippets.

@iswanj
Last active November 24, 2023 06:52
Show Gist options
  • Save iswanj/f8c60786c45ee1ff754f9744ff029df3 to your computer and use it in GitHub Desktop.
Save iswanj/f8c60786c45ee1ff754f9744ff029df3 to your computer and use it in GitHub Desktop.
calculate sum
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};
})
}
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' }
}
}
]
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);
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);
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));
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