def METHOD_NAME(self, key, columns=None, sections=None, n_look_ahead_rows=0,
         chunksize=MAX_MEM_ALLOWANCE_IN_BYTES):
    """
    Parameters
    ----------
    key : string, the location of a table within the DataStore.
    columns : list of Measurements, optional
        e.g. [('power', 'active'), ('power', 'reactive'), ('voltage')]
        if not provided then will return all columns from the table.
    sections : TimeFrameGroup; or list of nilmtk.TimeFrame objects;
        or a pd.PeriodIndex, optional.
        Defines the time sections to load.  If `self.window` is enabled
        then each `section` will be intersected with `self.window`.
    n_look_ahead_rows : int, optional, defaults to 0
        If >0 then each returned DataFrame will have a `look_ahead`
        property which will be a DataFrame of length `n_look_ahead_rows`
        of the data immediately in front of the data in the main DataFrame.
    chunksize : int, optional
    Returns
    ------- 
    generator of DataFrame objects
        Each DataFrame is has extra attributes:
            - timeframe : TimeFrame of section intersected with self.window
            - look_ahead : pd.DataFrame:
                with `n_look_ahead_rows` rows.  The first row will be for
                `section.end`.  `look_ahead` stores data which appears on 
                disk immediately after `section.end`; i.e. it ignores
                the next `section.start`.
        Returns an empty DataFrame if no data is available for the
        specified section (or if the section.intersection(self.window)
        is empty).
    Raises
    ------
    KeyError if `key` is not in store.
    """
    raise NotImplementedError("NotImplementedError")