anchor.diff:  
   [<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]    
   module Stats =
  -  // -- Experimental window logic 
  +  // -- Experimental fast sliding window logic 
     // - TODO: 
  -  //    -- still to do, possibly: prod, min, max, median, quantile, corr, cov
  -
  -  let internal applySeriesProj keyProj (denseProj:float seq -> float seq) (sparseProj:float option seq -> float option seq) 
  +  //    -- still to do, possibly: median, percentile, min, max, corr, cov
  +
  +  let internal applySeriesProj (denseProj:float seq -> float seq) (sparseProj:float option seq -> float option seq) 
       (series:Series<'K, float>) : Series<'K, float> =
  -    
  -    let newKeys = series.Index.Keys |> keyProj
       
       let makeOptionalSeries x = 
         let newVals = x |> Seq.map OptionalValue.asOption |> sparseProj
  -      Series(Index.ofKeys newKeys, Vector.ofOptionalValues newVals, series.VectorBuilder, series.IndexBuilder)
  +      Series(series.Index, Vector.ofOptionalValues newVals, series.VectorBuilder, series.IndexBuilder)
   
       let makeSeries x =
         let newVals = x |> denseProj
  -      Series(Index.ofKeys newKeys, Vector.ofValues newVals, series.VectorBuilder, series.IndexBuilder)
  +      Series(series.Index, Vector.ofValues newVals, series.VectorBuilder, series.IndexBuilder)
   
       match series.Vector.Data with
       | VectorData.DenseList x  -> makeSeries x
       | VectorData.SparseList x -> makeOptionalSeries x
       | VectorData.Sequence x   -> makeOptionalSeries x
       
  -  // moving window functions:
  -
     // Helps create a moving window calculation
     // nb. adopted from Seq.windowed in F# code base
     //   finit takes the first fully populated window array to an initial state
     //   fupdate takes the current state, incoming observation, and out-going observation to the next state
     //   ftransf takes the current state to the current output
  -  let internal movingWindowFn winSz finit fupdate ftransf (source: seq<_>) =
  +  let internal movingWindowFn winSz finit fupdate ftransf noVal (source: seq<_>) =
       seq {
          let arr = Array.zeroCreate winSz 
          let r = ref (winSz - 1)
  
positive.code:     { nobs = count; sum = sum; sump2 = sump2; sump3 = sump3; sump4 = sump4 }
    
    let internal updateSumsDense moment state curr outg =
      let newsum   = if moment < 1 then 0.0 else state.sum + curr - outg
      let newsump2 = if moment < 2 then 0.0 else state.sump2 + (pown curr 2) - (pown outg 2)
      let newsump3 = if moment < 3 then 0.0 else state.sump3 + (pown curr 3) - (pown outg 3)
      let newsump4 = if moment < 4 then 0.0 else state.sump4 + (pown curr 4) - (pown outg 4)
      { state with sum = newsum; sump2 = newsump2; sump3 = newsump3; sump4 = newsump4 }
  
    let internal initSumsSparse moment (init: float option []) =
      init |> Seq.filter Option.isSome |> Seq.map Option.get |> Seq.toArray |> (initSumsDense moment)
  
negative.code:   let internal applyMovingStatsTransform moment winSz minObs (proj: Sums -> float) series =
      checkWinSz winSz minObs
      let filtProj s = if (int s.nobs) >= minObs then Some(proj s) else None
      let calcDense = movingWindowFn winSz (initSumsDense moment) (updateSumsDense moment) proj nan
      let calcSparse = movingWindowFn winSz (initSumsSparse moment) (updateSumsSparse moment) filtProj None
      applySeriesProj calcDense calcSparse series
  
    let internal variance s =
      let v = (s.nobs * s.sump2 - s.sum * s.sum) / (s.nobs * s.nobs - s.nobs) 
  