text: # -*- coding: utf-8 -*-
  from numpy import arange as nparange
  from pandas import Series
  from ..utils import get_offset, verify_series
  
  def wma(close, length=None, asc=None, offset=None, **kwargs):
      """Indicator: Weighted Moving Average (WMA)"""
      # Validate Arguments
      close = verify_series(close)
      length = int(length) if length and length > 0 else 10
      min_periods = int(kwargs['min_periods']) if 'min_periods' in kwargs and kwargs['min_periods'] is not None else length
      asc = asc if asc else True
      offset = get_offset(offset)
  
      # Calculate Result
      total_weight = 0.5 * length * (length + 1)
      weights_ = Series(nparange(1, length + 1))
      weights = weights_ if asc else weights_[::-1]
  
      def linear(w):
          def _compute(x):
              return (w * x).sum() / total_weight
          return _compute
  
      close_ = close.rolling(length, min_periods=length)
      wma = close_.apply(linear(weights), raw=True)
  
      # Offset
      if offset != 0:
          wma = wma.shift(offset)
  
      # Name & Category
      wma.name = f"WMA_{length}"
      wma.category = 'overlap'
  
      return wma
  
  
  
  wma.__doc__ = \
  """Weighted Moving Average (WMA)
  
  The Weighted Moving Average where the weights are linearly increasing and
  the most recent data has the heaviest weight.
  
  Sources:
      https://en.wikipedia.org/wiki/Moving_average#Weighted_moving_average
  
  Calculation:
      Default Inputs:
          length=10, asc=True
      total_weight = 0.5 * length * (length + 1)
      weights_ = [1, 2, ..., length + 1]  # Ascending
      weights = weights if asc else weights[::-1]
  
      def linear_weights(w):
          def _compute(x):
              return (w * x).sum() / total_weight
          return _compute
  
      WMA = close.rolling(length)_.apply(linear_weights(weights), raw=True)
  
  Args:
      close (pd.Series): Series of 'close's
      length (int): It's period.  Default: 10
      asc (bool): Recent values weigh more.  Default: True
      offset (int): How many periods to offset the result.  Default: 0
  
  Kwargs:
      fillna (value, optional): pd.DataFrame.fillna(value)
      fill_method (value, optional): Type of fill method
  
  Returns:
      pd.Series: New feature generated.
  """
  