'Extra sources always have a sid column.
We expand the given data (by forward filling) to the full range of
the simulation dates, so that lookup is fast during simulation.'

def handle_extra_source(self, source_df, sim_params):

    if (source_df is None):
        return
    source_df.index = source_df.index.normalize()
    source_date_index = self.trading_calendar.sessions_in_range(sim_params.start_session, sim_params.end_session)
    grouped_by_sid = source_df.groupby(['sid'])
    group_names = grouped_by_sid.groups.keys()
    group_dict = {}
    for group_name in group_names:
        group_dict[group_name] = grouped_by_sid.get_group(group_name)
    extra_source_df = pd.DataFrame()
    for (identifier, df) in iteritems(group_dict):
        earliest_date = df.index[0]
        latest_date = df.index[(-1)]
        df = df.groupby(level=0).last()
        df = self._reindex_extra_source(df, source_date_index)
        if (not isinstance(identifier, Asset)):
            self._asset_start_dates[identifier] = earliest_date
            self._asset_end_dates[identifier] = latest_date
        for col_name in df.columns.difference(['sid']):
            if (col_name not in self._augmented_sources_map):
                self._augmented_sources_map[col_name] = {}
            self._augmented_sources_map[col_name][identifier] = df
        extra_source_df = extra_source_df.append(df)
    self._extra_source_df = extra_source_df
