          self._dtype = "float32" if data.dtype == np.float32 else "float64"
          self._row_size = self._get_max_row_size()
          self._out = np.empty_like(data, dtype=self._dtype)
  
      def __call__(self):
          """ Perform the exponential moving average calculation.
  
          Returns
          -------
          :class:`numpy.ndarray`
 
</s> remove         self._data = data
 </s> add         self._data = np.nan_to_num(data) </s> remove     def _ewma_vectorized_safe(self):
 </s> add     def _ewma_vectorized_safe(self) -> None: </s> remove         logger.debug("Calculating Average")
 </s> add         logger.debug("Calculating Average. Data points: %s", len(data)) </s> remove     def _ewma_vectorized_2d(self, data, out):
 </s> add     def _ewma_vectorized_2d(self, data: np.ndarray, out: np.ndarray) -> None: </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:
    def __call__(self) -> np.ndarray:
          self._dtype = "float32" if data.dtype == np.float32 else "float64"
          self._row_size = self._get_max_row_size()
          self._out = np.empty_like(data, dtype=self._dtype)
  
    def __call__(self) -> np.ndarray:
          """ Perform the exponential moving average calculation.
  
          Returns
          -------
          :class:`numpy.ndarray`
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