          retval = int(np.log(epsilon) / np.log(1 - self._alpha)) + 1
          logger.debug("row_size: %s", retval)
          return retval
  
      def _ewma_vectorized_safe(self):
          """ Perform the vectorized exponential moving average in a safe way. """
          num_rows = int(self._data.size // self._row_size)  # the number of rows to use
          leftover = int(self._data.size % self._row_size)  # the amount of data leftover
          first_offset = self._data[0]
  
 
</s> remove     def __call__(self):
 </s> add     def __call__(self) -> np.ndarray: </s> remove         return _ExponentialMovingAverage(data, self._args["smooth_amount"])()
 </s> add         retval = _ExponentialMovingAverage(data, self._args["smooth_amount"])()
        logger.debug("Calculated Smoothed data: shape: %s", retval.shape)
        return retval </s> remove     def start_iteration(self):
 </s> add     def start_iteration(self) -> int: </s> remove     def _get_calculations(self):
 </s> add     def _get_calculations(self) -> None: </s> remove         logger.debug("Calculating Average")
 </s> add         logger.debug("Calculating Average. Data points: %s", len(data))
    def _ewma_vectorized_safe(self) -> None:
          retval = int(np.log(epsilon) / np.log(1 - self._alpha)) + 1
          logger.debug("row_size: %s", retval)
          return retval
  
    def _ewma_vectorized_safe(self) -> None:
          """ Perform the vectorized exponential moving average in a safe way. """
          num_rows = int(self._data.size // self._row_size)  # the number of rows to use
          leftover = int(self._data.size % self._row_size)  # the amount of data leftover
          first_offset = self._data[0]
  
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