Overview

Tabular Data Processing

High-performance data transformation and analysis. This example demonstrates using 'TabularData' for data science tasks like feature normalization, linear modeling with ReLU activation, and error metrics (SMAPE), highlighting the efficiency of JIT-compiled RPN expressions for bulk processing.

Source Code

uses System.Data.Tabular;

// 1. Create a dataset representing sensor readings or predictions
var data := new TabularData;
data.AddColumn('Timestamp', [1000, 1010, 1020, 1030, 1040]);
data.AddColumn('Signal', [0.5, -1.2, 3.4, 2.1, -0.8]);
data.AddColumn('Actual', [0.6, 0.1, 3.0, 2.5, 0.1]);

PrintLn('<h3>Raw Sensor Data</h3>');
PrintLn(data.ExportToSeparated(['Timestamp', 'Signal', 'Actual']).Replace(#10, '<br>'));

// 2. Data Normalization (Min-Max Scaling)
// Calculate range metrics manually (as 'min'/'max' aggregates are not in this binary)
var signalVals := data.Evaluate(['"Signal"']);
var sMin := signalVals[0];
var sMax := signalVals[0];
for var v in signalVals do begin
   if v < sMin then sMin := v;
   if v > sMax then sMax := v;
end;
var sRange := sMax - sMin;

// Scale Signal to [0, 1] range: (Signal - Min) / Range
data.EvaluateNewColumn('Normalized', [ '"Signal"', sMin, '-', sRange, '/' ]);

// 3. Simple Linear Model + ReLU Activation
// Simulate a prediction: (Signal * 1.5) + 0.5, clamped to positive values via 'relu'
// In this engine, 'relu' is a fused binary operator that performs max(0, a + b)
data.EvaluateNewColumn('Prediction', [ '"Signal"', 1.5, '*', 0.5, 'relu' ]);

// 4. Error Analysis (SMAPE component)
// 'smape' opcode calculates abs(a-b) / (abs(a)+abs(b)) for each row
data.EvaluateNewColumn('ErrorRate', [ '"Prediction"', '"Actual"', 'smape' ]);

PrintLn('<h4>Processed Features & Predictions</h4>');
PrintLn(data.ExportToSeparated(['Timestamp', 'Normalized', 'Prediction', 'ErrorRate']).Replace(#10, '<br>'));

// 5. Aggregate Metrics
var avgError := data.EvaluateAggregate('sum', [ '"ErrorRate"' ]) / 5;

PrintLn('<h4>Summary Metrics</h4>');
PrintLn('<b>Mean SMAPE Error:</b> ' + Float(avgError).ToString(4));
PrintLn('<b>Peak Signal:</b> ' + Float(sMax).ToString(2));

// Note: While this example uses 5 rows for readability, TabularData 
// is designed to process millions of rows using these same JIT expressions.
try
   data.LockAndShare('GlobalAnalyticsCache');
except
   // Might already be shared
end;

Result

<h3>Raw Sensor Data</h3>
Timestamp,Signal,Actual
<br>1000,0.5,0.6
<br>1010,-1.2,0.1
<br>1020,3.4,3
<br>1030,2.1,2.5
<br>1040,-0.8,0.1
<br>
<h4>Processed Features & Predictions</h4>
Timestamp,Normalized,Prediction,ErrorRate
<br>1000,0.369565217391304,1.25,0.351351351351351
<br>1010,0,0,1
<br>1020,1,5.6,0.302325581395349
<br>1030,0.717391304347826,3.65,0.186991869918699
<br>1040,0.0869565217391304,0,1
<br>
<h4>Summary Metrics</h4>
<b>Mean SMAPE Error:</b> 0.5681
<b>Peak Signal:</b> 3.40
On this page