def feature_spawn(df):
    """Takes a time series and spawns several new features that explicitly
    detail information about the series.

    The DataFrame spawned contains the following features
    spawned for each column in the input DataFrame:

        Exponentially Weighted Moving Average of various Half Lives:
            1 day,
            1 week,
            1 month,
            1 quarter,
            6 months,
            1 year

        Rolling vol of different window sizes:
            1 week,
            1 month,
            1 quarter

    :param df:              The dataset of independent variables
    :type  df:              pd.DataFrame

    :return:                The DataFrame containing spawned features
    :rtype:                 pd.DataFrame
    """
    hlf_dict = {'week': 5, 'month': 22, 'quarter': 66, 'half_year': 132,
        'year': 260}
    for col in df.columns:
        for half_life in hlf_dict:
            df[col + '_ema_' + half_life] = df[col].ewm(span=hlf_dict[
                half_life]).mean()
    for i, half_life in enumerate(hlf_dict):
        if i < 3:
            df[col + '_roll_vol_' + half_life] = df[col].rolling(window=
                hlf_dict[half_life]).std(ddof=0)
    df.dropna(inplace=True)
    return df
