--- title: "Data Science Methods for Forecasting in Energy and Economics" date: 2025-07-10 format: revealjs: embed-resources: true footer: "" execute: daemon: false highlight-style: github --- #### B-spline Basis Functions ```{ojs} bsplineData = FileAttachment("basis_functions.csv").csv({ typed: true }) ``` ```{ojs} knotValues = Array.from(new Set(bsplineData.map(d => d.knots))).sort((a, b) => a - b) minKnots = Math.min(...knotValues) maxKnots = Math.max(...knotValues) muValues = Array.from(new Set(bsplineData.map(d => d.mu))).sort((a, b) => a - b) minMu = Math.min(...muValues) maxMu = Math.max(...muValues) ``` ```{ojs} // Create a more compact layout for controls viewof controls = Inputs.form({ knots: Inputs.range([minKnots, maxKnots], {value: minKnots, step: 1, label: "Knots:", width: 200}), mu: Inputs.range([minMu, maxMu], {value: 0.5, step: 0.1, label: "μ:", width: 200}) }, { submit: false, layout: 'horizontal', style: 'display: flex; gap: 20px; align-items: center; margin-bottom: 10px; font-size: 0.9em;' }) selectedKnots = controls.knots selectedMu = controls.mu ``` ```{ojs} filteredBspline = bsplineData.filter(function(row) { return selectedKnots == row.knots && Math.abs(selectedMu - row.mu) < 0.001; }) ``` ```{ojs} Plot.plot({ grid: true, y: {domain: [0, 0.7]}, x: {label: "x", domain: [0, 1]}, marks: [ Plot.line(filteredBspline, { x: "x", y: "y", stroke: "b", strokeWidth: 5, }), Plot.ruleY([0]) ], color: { legend: false, label: "Basis Function" }, marginRight: 80, width: 800, height: 400, // title: `B-spline Basis Functions (${selectedKnots} knots, μ = ${selectedMu})` }) ``` ::: {.callout-note} TODO :::