
<p/>
<center>
<boldmaroon>Stats with and without out-of-stream variables</boldmaroon>
</center>

POKI_PUT_TOC_HERE

<p/>
<button style="font-weight:bold;color:maroon;border:0" onclick="expand_all();" href="javascript:;">Expand all sections</button>
<button style="font-weight:bold;color:maroon;border:0" onclick="collapse_all();" href="javascript:;">Collapse all sections</button>

<!-- ================================================================ -->
<h1>Overview</h1>
<button style="font-weight:bold;color:maroon;border:0" padding=0 onclick="toggle_by_name('section_toggle_overview');" href="javascript:;">Toggle section visibility</button>
<div id="section_toggle_overview" style="display: block">

<p/> One of Miller&rsquo;s strengths is its compact notation: for example, given input of the form

POKI_RUN_COMMAND{{head -n 5 ../data/medium}}HERE

you can simply do

POKI_RUN_COMMAND{{mlr --oxtab stats1 -a sum -f x ../data/medium}}HERE

or

POKI_RUN_COMMAND{{mlr --opprint stats1 -a sum -f x -g b ../data/medium}}HERE

rather than the more tedious

POKI_INCLUDE_AND_RUN_ESCAPED(oosvar-example-sum.sh)HERE

or

POKI_INCLUDE_AND_RUN_ESCAPED(oosvar-example-sum-grouped.sh)HERE

<p/> The former (<tt>mlr stats1</tt> et al.) has the advantages of being easier
to type, being less error-prone to type, and running faster.

<p/> Nonetheless, out-of-stream variables (which I whimsically call
<i>oosvars</i>), begin/end blocks, and emit statements give you the ability to
implement logic &mdash; if you wish to do so &mdash; which isn&rsquo;t present
in other Miller verbs.  (If you find yourself often using the same
out-of-stream-variable logic over and over, please file a request at <a
href="https://github.com/johnkerl/miller/issues">https://github.com/johnkerl/miller/issues</a>
to get it implemented directly in C as a Miller verb of its own.)

<p/> The following examples compute some things using oosvars which are already
computable using Miller verbs, by way of providing food for thought.

</div>
<!-- ================================================================ -->
<h1>Mean without/with oosvars</h1>
<button style="font-weight:bold;color:maroon;border:0" padding=0 onclick="toggle_by_name('section_toggle_mean');" href="javascript:;">Toggle section visibility</button>
<div id="section_toggle_mean" style="display: block">

POKI_RUN_COMMAND{{mlr --opprint stats1 -a mean -f x data/medium}}HERE
POKI_INCLUDE_AND_RUN_ESCAPED(data/mean-with-oosvars.sh)HERE

</div>
<!-- ================================================================ -->
<h1>Keyed mean without/with oosvars</h1>
<button style="font-weight:bold;color:maroon;border:0" padding=0 onclick="toggle_by_name('section_toggle_keyed_mean');" href="javascript:;">Toggle section visibility</button>
<div id="section_toggle_keyed_mean" style="display: block">

POKI_RUN_COMMAND{{mlr --opprint stats1 -a mean -f x -g a,b data/medium}}HERE
POKI_INCLUDE_AND_RUN_ESCAPED(data/keyed-mean-with-oosvars.sh)HERE

</div>
<!-- ================================================================ -->
<h1>Variance and standard deviation without/with oosvars</h1>
<button style="font-weight:bold;color:maroon;border:0" padding=0 onclick="toggle_by_name('section_toggle_var_stddev');" href="javascript:;">Toggle section visibility</button>
<div id="section_toggle_var_stddev" style="display: block">

POKI_RUN_COMMAND{{mlr --oxtab stats1 -a count,sum,mean,var,stddev -f x data/medium}}HERE
POKI_RUN_COMMAND{{cat variance.mlr}}HERE
POKI_RUN_COMMAND{{mlr --oxtab put -q -f variance.mlr data/medium}}HERE

You can also do this keyed, of course, imitating the keyed-mean example above.

</div>
<!-- ================================================================ -->
<h1>Min/max without/with oosvars</h1>
<button style="font-weight:bold;color:maroon;border:0" padding=0 onclick="toggle_by_name('section_toggle_min_max');" href="javascript:;">Toggle section visibility</button>
<div id="section_toggle_min_max" style="display: block">

POKI_RUN_COMMAND{{mlr --oxtab stats1 -a min,max -f x data/medium}}HERE

POKI_RUN_COMMAND{{mlr --oxtab put -q '@x_min = min(@x_min, $x); @x_max = max(@x_max, $x); end{emitf @x_min, @x_max}' data/medium}}HERE

</div>
<!-- ================================================================ -->
<h1>Keyed min/max without/with oosvars</h1>
<button style="font-weight:bold;color:maroon;border:0" padding=0 onclick="toggle_by_name('section_toggle_keyed_min_max');" href="javascript:;">Toggle section visibility</button>
<div id="section_toggle_keyed_min_max" style="display: block">

POKI_RUN_COMMAND{{mlr --opprint stats1 -a min,max -f x -g a data/medium}}HERE
POKI_INCLUDE_AND_RUN_ESCAPED(data/keyed-min-max-with-oosvars.sh)HERE

</div>
<!-- ================================================================ -->
<h1>Delta without/with oosvars</h1>
<button style="font-weight:bold;color:maroon;border:0" padding=0 onclick="toggle_by_name('section_toggle_delta');" href="javascript:;">Toggle section visibility</button>
<div id="section_toggle_delta" style="display: block">

POKI_RUN_COMMAND{{mlr --opprint step -a delta -f x data/small}}HERE

POKI_RUN_COMMAND{{mlr --opprint put '$x_delta = is_present(@last) ? $x - @last : 0; @last = $x' data/small}}HERE

</div>
<!-- ================================================================ -->
<h1>Keyed delta without/with oosvars</h1>
<button style="font-weight:bold;color:maroon;border:0" padding=0 onclick="toggle_by_name('section_toggle_keyed_delta');" href="javascript:;">Toggle section visibility</button>
<div id="section_toggle_keyed_delta" style="display: block">

POKI_RUN_COMMAND{{mlr --opprint step -a delta -f x -g a data/small}}HERE

POKI_RUN_COMMAND{{mlr --opprint put '$x_delta = is_present(@last[$a]) ? $x - @last[$a] : 0; @last[$a]=$x' data/small}}HERE

</div>
<!-- ================================================================ -->
<h1>Exponentially weighted moving averages without/with oosvars</h1>
<button style="font-weight:bold;color:maroon;border:0" padding=0 onclick="toggle_by_name('section_toggle_ewma');" href="javascript:;">Toggle section visibility</button>
<div id="section_toggle_ewma" style="display: block">

POKI_INCLUDE_AND_RUN_ESCAPED(verb-example-ewma.sh)HERE

POKI_INCLUDE_AND_RUN_ESCAPED(oosvar-example-ewma.sh)HERE

</div>
