Docs: Update benchmark results

This commit is contained in:
github-actions[bot]
2025-11-07 22:07:45 +00:00
parent b5f81c6e8a
commit 1687dca49c
42 changed files with 784 additions and 847 deletions

View File

@@ -1,26 +1,29 @@
async function processCSV(csv, config) {
const { parse } = await import('https://cdn.skypack.dev/papaparse@5.4.1');
const processCSV = async (csv, config) => {
const { parse } = await import('https://cdn.jsdelivr.net/npm/papaparse@5.4.1/+esm');
const { filterColumn: fc, filterValue: fv, groupBy: gb, aggregateColumn: ac, operation: op } = config;
const { data } = parse(csv, { header: true, skipEmptyLines: true });
const filtered = data.filter(r => r[fc] == fv);
const filtered = data.filter(row =>
String(row[config.filterColumn]).trim() === String(config.filterValue).trim()
);
const grouped = filtered.reduce((acc, row) => {
const key = row[gb];
const key = row[config.groupBy];
if (!acc[key]) acc[key] = [];
acc[key].push(row);
return acc;
}, {});
return Object.entries(grouped).map(([key, rows]) => {
const vals = rows.map(r => parseFloat(r[ac]) || 0);
const result = op === 'sum'
? vals.reduce((a, b) => a + b, 0)
: op === 'avg'
? vals.reduce((a, b) => a + b, 0) / vals.length
: vals.length;
return { [gb]: key, result };
});
}
const aggregate = (rows) => {
const values = rows.map(r => parseFloat(r[config.aggregateColumn]) || 0);
if (config.operation === 'sum') return values.reduce((a, b) => a + b, 0);
if (config.operation === 'avg') return values.reduce((a, b) => a + b, 0) / values.length;
return values.length;
};
return Object.entries(grouped).map(([key, rows]) => ({
[config.groupBy]: key,
result: aggregate(rows)
}));
};
export default processCSV;

View File

@@ -1,12 +1,12 @@
const processCSV = async (csv, { filterColumn, filterValue, groupBy, aggregateColumn, operation }) => {
const { default: Papa } = await import('https://cdn.jsdelivr.net/npm/papaparse@5.4.1/+esm');
const processCSV = async (csvString, config) => {
const { parse } = await import('https://cdn.skypack.dev/papaparse');
const { data } = Papa.parse(csv, { header: true, skipEmptyLines: true });
const { data } = parse(csvString, { header: true, skipEmptyLines: true });
const filtered = data.filter(row => row[filterColumn] == filterValue);
const filtered = data.filter(row => row[config.filterColumn] == config.filterValue);
const grouped = filtered.reduce((acc, row) => {
const key = row[groupBy];
const key = row[config.groupBy];
if (!acc[key]) acc[key] = [];
acc[key].push(row);
return acc;
@@ -14,17 +14,15 @@ const processCSV = async (csv, { filterColumn, filterValue, groupBy, aggregateCo
return Object.entries(grouped).map(([key, rows]) => {
let result;
if (operation === 'count') {
if (config.operation === 'count') {
result = rows.length;
} else {
const values = rows.map(r => parseFloat(r[aggregateColumn]) || 0);
result = operation === 'sum'
const values = rows.map(r => parseFloat(r[config.aggregateColumn]) || 0);
result = config.operation === 'sum'
? values.reduce((a, b) => a + b, 0)
: values.reduce((a, b) => a + b, 0) / values.length;
}
return { [groupBy]: key, [operation]: result };
return { [config.groupBy]: key, result };
});
};
export default processCSV;

View File

@@ -1,30 +1,26 @@
async function processCSV(csvString, config) {
const { parse } = await import('https://cdn.skypack.dev/papaparse@5.4.1');
async function processCSV(csv, config) {
const { parse } = await import('https://esm.sh/papaparse@5.4.1');
const { groupBy, sumBy, meanBy, countBy } = await import('https://esm.sh/lodash-es@4.17.21');
const { filterColumn: fc, filterValue: fv, groupBy: gb, aggregateColumn: ac, operation: op } = config;
const { data } = parse(csv, { header: true, skipEmptyLines: true });
const { data } = parse(csvString, { header: true, skipEmptyLines: true });
const filtered = data.filter(row =>
String(row[config.filterColumn]) === String(config.filterValue)
);
const filtered = data.filter(row => row[fc] == fv);
const grouped = Object.entries(
groupBy(filtered, config.groupBy)
);
const grouped = filtered.reduce((acc, row) => {
const key = row[gb];
if (!acc[key]) acc[key] = [];
acc[key].push(row);
return acc;
}, {});
const ops = {
sum: arr => sumBy(arr, r => parseFloat(r[config.aggregateColumn]) || 0),
avg: arr => meanBy(arr, r => parseFloat(r[config.aggregateColumn]) || 0),
count: arr => arr.length
};
return Object.entries(grouped).map(([key, rows]) => {
let result;
if (op === 'count') {
result = rows.length;
} else {
const values = rows.map(r => parseFloat(r[ac]) || 0);
result = op === 'sum'
? values.reduce((a, b) => a + b, 0)
: values.reduce((a, b) => a + b, 0) / values.length;
}
return { [gb]: key, result };
});
return grouped.map(([key, rows]) => ({
[config.groupBy]: key,
result: ops[config.operation](rows)
}));
}
export default processCSV;

View File

@@ -1,40 +1,42 @@
const processCSV = async (csvString, {
const processCSV = async (
csvString, {
filterColumn,
filterValue,
groupBy,
aggregateColumn,
operation
}) => {
const { default: Papa } = await import('https://cdn.jsdelivr.net/npm/papaparse@5.4.1/+esm');
}
) => {
const [Papa, {
default: _
}] = await Promise.all([
import('https://cdn.jsdelivr.net/npm/papaparse@5.4.1/papaparse.min.js'),
import('https://cdn.jsdelivr.net/npm/lodash-es@4.17.21/+esm'),
]);
const aggregations = {
sum: g => g.s,
count: g => g.c,
avg: g => g.c ? g.s / g.c : 0,
};
const {
data
} = Papa.parse(csvString, {
header: true,
dynamicTyping: true,
skipEmptyLines: true,
});
const groupedData = Papa.parse(csvString, {
header: true,
skipEmptyLines: true,
dynamicTyping: true,
}).data
.filter(row => row[filterColumn] === filterValue)
.reduce((acc, row) => {
const key = row[groupBy];
const val = row[aggregateColumn];
const aggregators = {
sum: g => _.sumBy(g, aggregateColumn),
avg: g => _.meanBy(g, aggregateColumn),
count: g => g.length,
};
acc[key] = acc[key] || { s: 0, c: 0 };
if (typeof val === 'number' && !isNaN(val)) {
acc[key].s += val;
}
acc[key].c++;
return acc;
}, {});
return Object.entries(groupedData).map(([key, group]) => ({
[groupBy]: /^-?\d+(\.\d+)?$/.test(key) ? Number(key) : key,
[operation]: aggregations[operation](group),
}));
return _.chain(data)
.filter({
[filterColumn]: filterValue
})
.groupBy(groupBy)
.map((rows, key) => ({
[groupBy]: Number.isNaN(+key) ? key : +key,
result: aggregators[operation](rows),
}))
.value();
};
export default processCSV;

View File

@@ -1,20 +1,18 @@
let cache;
async function processCSV(csv,cfg){
const {csvParse,rollups}=await (cache??=import('https://cdn.jsdelivr.net/npm/d3@7/+esm'));
const {filterColumn,filterValue,groupBy,aggregateColumn,operation}=cfg;
if(!['sum','avg','count'].includes(operation))throw new Error('Unsupported operation');
if(!csv||!filterColumn||!groupBy)throw new Error('Missing essentials');
if(operation!=='count'&&!aggregateColumn)throw new Error('Missing aggregateColumn');
const rows=csvParse(csv).filter(r=>r[filterColumn]==filterValue);
if(!rows.length)return[];
const fn=operation==='count'?v=>v.length:v=>{
let s=0,n=0;
for(const row of v){
const val=+row[aggregateColumn];
if(!Number.isNaN(val)){s+=val;n++;}
}
return operation==='sum'?s:n?s/n:0;
};
return rollups(rows,fn,r=>r[groupBy]).map(([k,v])=>({[groupBy]:k,[operation]:v}));
}
const load=()=>cache||(cache=Promise.all([
import('https://cdn.jsdelivr.net/npm/papaparse@5.4.1/papaparse.min.mjs'),
import('https://cdn.jsdelivr.net/npm/d3-array@3/+esm')
]));
const processCSV=async(csv,cfg)=>{
const[{default:Papa},{rollup}]=await load();
const{filterColumn:f,filterValue:v,groupBy:g,aggregateColumn:a,operation:o}=cfg;
const rows=Papa.parse(csv,{header:1,dynamicTyping:1,skipEmptyLines:1}).data.filter(r=>r[f]===v);
if(!rows.length)return[];
const map=rollup(rows,s=>{
if(o==='count')return s.length;
const t=s.reduce((p,c)=>p+(Number(c[a])||0),0);
return o==='avg'?t/s.length:t;
},r=>r[g]);
return Array.from(map,([k,val])=>({[g]:k,result:val}));
};
export default processCSV;

View File

@@ -1,30 +1,35 @@
async function processCSV(csv, cfg) {
const {filterColumn,filterValue,groupBy,aggregateColumn,operation} = cfg
if(!csv||!filterColumn||!groupBy||!operation) throw new Error('Invalid configuration')
const [{parse},{default:lodash}] = await Promise.all([
import('https://cdn.jsdelivr.net/npm/papaparse@5.4.1/+esm'),
import('https://cdn.jsdelivr.net/npm/lodash-es@4.17.21/+esm')
])
const {data,errors} = parse(csv,{header:true,skipEmptyLines:true,dynamicTyping:true})
if(errors?.length) throw new Error('CSV parse error')
const rows = data.filter(r=>r[filterColumn]===filterValue)
if(!rows.length) return []
const grouped = lodash.groupBy(rows,r=>r[groupBy])
async function processCSV(csv, c) {
if (typeof csv !== 'string') throw new TypeError('csv must be string')
if (!c || typeof c !== 'object') throw new TypeError('config required')
let { filterColumn, filterValue, groupBy, aggregateColumn, operation } = c
if (!filterColumn || !groupBy || !operation) throw new Error('missing config')
if (!['sum', 'avg', 'count'].includes(operation)) throw new Error('bad op')
const { parse } = await import('https://cdn.skypack.dev/papaparse@5.4.1')
const _ = (await import('https://cdn.skypack.dev/lodash-es@4.17.21')).default
const { data, errors } = parse(csv, { header: true, dynamicTyping: true, skipEmptyLines: true })
if (errors && errors.length) throw new Error('csv parse error')
const rows = _.filter(data, r => r && r[filterColumn] === filterValue)
if (!rows.length) return []
const grouped = _.groupBy(rows, r => r[groupBy])
const out = []
for(const k in grouped){
const g = grouped[k]
let v
if(operation==='count') v = g.length
else{
const nums = g.map(r=>Number(r[aggregateColumn])).filter(n=>Number.isFinite(n))
if(!nums.length) { v = operation==='sum'?0:null }
else{
const s = nums.reduce((a,b)=>a+b,0)
v = operation==='sum'?s:s/nums.length
}
_.forOwn(grouped, (items, k) => {
let result
if (operation === 'count') {
result = items.length
} else {
const nums = _.map(items, i => Number(i[aggregateColumn])).filter(v => Number.isFinite(v))
if (!nums.length) return
const sum = _.sum(nums)
result = operation === 'sum' ? sum : sum / nums.length
}
out.push({[groupBy]:k,result:v})
}
out.push({ [groupBy]: k, result })
})
return out
}
export default processCSV;