<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def ema(eqdata, **kwargs):
 """ Exponential moving average with the given span. Parameters eqdata : DataFrame Must have exactly 1 column on which to calculate EMA span : int, optional Span for exponential moving average. Cf. `pandas.stats.moments.ewma <http://pandas.pydata.org/pandas-docs/stable/generated/pandas.stats.moments.ewma.html>`_ and `additional Pandas documentation <http://pandas.pydata.org/pandas-docs/stable/computation.html#exponentially-weighted-moment-functions>`_. outputcol : str, optional Column to use for output. Defaults to 'EMA'. selection : str, optional Column of eqdata on which to calculate ema. If `eqdata` has only 1 column, `selection` is ignored, and ema is calculated on that column. Defaults to 'Adj Close'. Returns --------- emadf : DataFrame Exponential moving average using the given `span`. """

    if len(eqdata.shape) > 1 and eqdata.shape[1] != 1:
        _selection = kwargs.get('selection', 'Adj Close')
        _eqdata = eqdata.loc[:, _selection]
    else:
        _eqdata = eqdata
    _span = kwargs.get('span', 20)
    _col = kwargs.get('outputcol', 'EMA')
    _emadf = pd.DataFrame(index=_eqdata.index, columns=[_col], dtype=np.float64)
    _emadf.loc[:, _col] = _eqdata.ewm(span=_span, min_periods=0, adjust=True, ignore_na=False).mean().values.flatten()
    return _emadf