Created
March 25, 2018 16:25
-
-
Save davebshow/4d927597d6a28d1fc70c9c51ba7dfa1f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import functools | |
import pandas as pd | |
class Transformer: | |
__mappings__ = {} | |
@classmethod | |
def transform(cls, df, *, groupby=None, filter=None): | |
transformer = cls(df, groupby=groupby, filter=filter) | |
return transformer.apply_mappings() | |
@classmethod | |
def mapping(cls, target_key): | |
if not isinstance(target_key, str): | |
raise RuntimeError("`mapping` decorator requires pos arg `target key`") | |
def _mapping(fn): | |
cls.__mappings__[target_key] = fn | |
@functools.wraps(fn) | |
def wrapper(*args, **kwargs): | |
return fn(*args, **kwargs) | |
return wrapper | |
return _mapping | |
def __init__(self, df): | |
self._df = df | |
def _call(self, name): | |
return self.__mappings__[name](self._df) | |
def apply_mappings(self): | |
return NotImplementedError | |
class PandasTransformer(Transformer): | |
def __init__(self, df, *, groupby=None, filter=None): | |
if filter: | |
df = df[df[filter]] | |
if groupby: | |
df = df.groupby(groupby) | |
self._output_df = pd.DataFrame(columns=self.__mappings__.keys()) | |
super().__init__(df) | |
def apply_mappings(self): | |
for key, value in self.__mappings__.items(): | |
self._output_df.loc[:, key] = value(self._df) | |
return self._output_df | |
@Transformer.mapping('target') | |
def add(a, b): | |
return a + b |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment