示例#1
0
def _function_by_group(function, table, model=None, group_by=None, **params):
    if isinstance(table, pd.DataFrame) and group_by is not None:
        table, group_keys = _group(table, group_by)
    else:
        group_keys = table['_grouped_data'].keys()
   
    sample_group = group_keys[0]
    if model is None:
        sample_result = function(table=table['_grouped_data'][sample_group], **params)
    else:
        sample_result = function(table=table['_grouped_data'][sample_group],
                                  model=model['_grouped_data'][sample_group], **params)
    res_keys = sample_result.keys()
    df_keys = [k for k, v in sample_result.items() if isinstance(v, pd.DataFrame)]
    model_keys_containing_repr = [k for k, v in sample_result.items() if isinstance(v, dict) and 'report' in v]
    
    res_dict = dict()
    for res_key in res_keys:
        res_dict[res_key] = {'_grouped_data':dict()}
        
    for group in group_keys:
        if model is None:
            res_group = function(table=table['_grouped_data'][group], **params)
        else:
            res_group = function(table=table['_grouped_data'][group],
                                        model=model['_grouped_data'][group], **params)
        
        for res_key in res_keys:
            res_dict[res_key]['_grouped_data'][group] = res_group[res_key]
    
    
    for repr_key in model_keys_containing_repr:
        rb = ReportBuilder()
        for group in group_keys:
            rb.addMD('{group}'.format(group=group))
            rb.merge(res_dict[repr_key]['_grouped_data'][group]['report'])
        res_dict[repr_key]['report'] = rb.get()    
            
    for df_key in df_keys:
        res_dict[df_key] = _flatten(res_dict[df_key])
    
    return res_dict
示例#2
0
def _function_by_group(function,
                       table=None,
                       model=None,
                       group_by=None,
                       **params):
    if table is not None:
        if isinstance(
                table,
                pd.DataFrame) and group_by is not None:  # table and group_by
            table, group_keys = _group(table, group_by)
        elif isinstance(table,
                        dict) and '_grouped_data' in table:  # grouped_data
            group_keys = [*table['_grouped_data']]
            group_by = table['_group_by']

        elif isinstance(table, pd.DataFrame) and group_by is None:
            raise Exception('This function requires group_by')
        else:
            raise Exception('Unknown type.')
    elif model is not None:
        if isinstance(model, dict) and '_grouped_data' in model:
            group_keys = [*model['_grouped_data']]
            group_by = model['_group_by']
    else:
        raise Exception(
            'This function requires a table or a model as an input.')

    sample_group = group_keys[0]
    if table is not None and model is None:
        sample_result = function(table=table['_grouped_data'][sample_group],
                                 **params)
    elif table is not None and model is not None:
        sample_result = function(table=table['_grouped_data'][sample_group],
                                 model=model['_grouped_data'][sample_group],
                                 **params)
    else:
        sample_result = function(model=model['_grouped_data'][sample_group],
                                 **params)

    res_keys = [*sample_result]
    df_keys = [
        k for k, v in sample_result.items() if isinstance(v, pd.DataFrame)
    ]
    model_keys_containing_repr = [
        k for k, v in sample_result.items()
        if isinstance(v, dict) and 'report' in v
    ]

    res_dict = dict()
    for res_key in res_keys:
        res_dict[res_key] = {'_grouped_data': dict(), '_group_by': group_by}

    for group in group_keys:
        if table is not None and model is None:
            res_group = function(table=table['_grouped_data'][group], **params)
        elif table is not None and model is not None:
            res_group = function(table=table['_grouped_data'][group],
                                 model=model['_grouped_data'][group],
                                 **params)
        else:
            res_group = function(model=model['_grouped_data'][group], **params)

        for res_key in res_keys:
            res_dict[res_key]['_grouped_data'][group] = res_group[res_key]

    for repr_key in model_keys_containing_repr:
        rb = ReportBuilder()
        for group in group_keys:
            rb.addMD('{group}'.format(group=group))
            rb.merge(res_dict[repr_key]['_grouped_data'][group]['report'])
        res_dict[repr_key]['report'] = rb.get()

    for df_key in df_keys:
        res_dict[df_key] = _flatten(res_dict[df_key])

    return res_dict