Source code for pbpstats.data_loader.factory

"""
``DataLoaderFactory`` can be used to create data loader objects from the ``data_loader`` module.

The following code will create a data loader object for loading enhanced pbp from stats.nba.com.

.. code-block:: python

    from pbpstats.data_loader.factory import DataLoaderFactory

    data_loader = DataLoaderFactory()
    stats_enhanced_pbp_data_loader = data_loader.get_data_loader("stats_nba", "EnhancedPbp")
    print(stats_enhanced_pbp_data_loader[0])
    # prints "<class 'pbpstats.data_loader.stats_nba.enhanced_pbp_loader.StatsNbaEnhancedPbpLoader'>"
"""

from collections import defaultdict

import pbpstats.data_loader as data_loader


[docs]class DataLoaderFactory(object): """ Class for factory of data loader classes. On initialization will load in all data loader classes in ``data_loader`` module """ def __init__(self): self.loaders = defaultdict(lambda: defaultdict(lambda: [])) self._load_data_loaders() def _load_data_loaders(self): """ loads data loaders from data_loader package """ loaders = dict( [ (name, cls) for name, cls in data_loader.__dict__.items() if isinstance(cls, type) ] ) for name, loader_cls in loaders.items(): if hasattr(loader_cls, "resource"): file_source = loaders[name.replace("Loader", "FileLoader")] web_source = loaders[name.replace("Loader", "WebLoader")] loader = { "loader": loader_cls, "file_source": file_source, "web_source": web_source, } self.loaders[loader_cls.resource][loader_cls.data_provider].append( loader )
[docs] def get_data_loader(self, data_provider, resource): """ Gets data loader classes for given data provider and resource. :param str data_provider: Which data provider should data be loaded from. Options are 'stats_nba' or 'data_nba' or 'live' :param str resource: Name of class from resources directory :return: list of data loader classes :rtype: list """ return self.loaders[resource][data_provider]