          if offset != 0:
              offset = np.array(offset, copy=False).astype(self._dtype, copy=False)
              out += offset * scaling_factors[1:]
  
      def _ewma_vectorized_2d(self, data, out):
          """ Calculates the exponential moving average over the last axis.
  
          The result is processed in place into the array passed to the `out` parameter
  
          Parameters
 
</s> remove     def _ewma_vectorized(self, data, out, offset=None):
 </s> add     def _ewma_vectorized(self,
                         data: np.ndarray,
                         out: np.ndarray,
                         offset: Optional[float] = None) -> None: </s> remove     def _ewma_vectorized_safe(self):
 </s> add     def _ewma_vectorized_safe(self) -> None: </s> remove     def __call__(self):
 </s> add     def __call__(self) -> np.ndarray: </s> remove     def _collate_stats(self, session_id, timestamps):
 </s> add     def _collate_stats(self, session_id: int) -> dict: </s> remove         raise ValueError("Invalid log level: %s" % loglevel)
 </s> add         raise ValueError(f"Invalid log level: {loglevel}")
    def _ewma_vectorized_2d(self, data: np.ndarray, out: np.ndarray) -> None:
          if offset != 0:
              offset = np.array(offset, copy=False).astype(self._dtype, copy=False)
              out += offset * scaling_factors[1:]
  
    def _ewma_vectorized_2d(self, data: np.ndarray, out: np.ndarray) -> None:
          """ Calculates the exponential moving average over the last axis.
  
          The result is processed in place into the array passed to the `out` parameter
  
          Parameters
keep keep keep keep replace keep keep keep keep keep
 Bugfixes:
  - Stats graph - Handle NaNs in data
  - logger - de-elevate matplotlib font messages 
lib/gui/analysis/stats.py