示例#1
0
def calculate_comparative_rows(data, aggregation_level, data_format,
                               unique_id):
    # for quarter we need to average summation
    quarter_comparative_dict = {}
    if data_format == 'quarter':
        for i in range(0, len(data)):
            key = data[i][unique_id]
            if key not in quarter_comparative_dict.keys():
                quarter_comparative_dict[key] = data[i]
            else:
                for k, v in data[i].items():
                    if k not in ['state_name', 'district_name', unique_id]:
                        quarter_comparative_dict[key][
                            k] += data[i][k] if data[i][k] else 0
                    else:
                        quarter_comparative_dict[key][k] = data[i][k]
        data = []
        for _, v in quarter_comparative_dict.items():
            data.append(v)

        for i in range(0, len(data)):
            for k, v in data[i].items():
                if k not in ['state_name', 'district_name', unique_id]:
                    data[i][k] = handle_average(v)
    response = []
    for i in range(0, len(data)):
        response.append(
            calculate_percentage_single_row(deepcopy(data[i]), False))
    response = prepare_structure_comparative(deepcopy(response),
                                             aggregation_level)
    return response
def prepare_quarter_dict(data, data_period, unique_id):
    latest_value_cols = [
        'num_launched_districts', 'num_launched_blocks', 'num_launched_awcs',
        'num_launched_states'
    ]
    # for quarter we need to average summation
    quarter_comparative_dict = {}
    if data_period == 'quarter':
        for i in range(0, len(data)):
            key = data[i][unique_id]
            if key not in quarter_comparative_dict.keys():
                quarter_comparative_dict[key] = data[i]
            else:
                for k, v in data[i].items():
                    if k in latest_value_cols:
                        quarter_comparative_dict[key][k] = max(
                            quarter_comparative_dict[key][k],
                            data[i][k] if data[i][k] else 0)
                    elif k not in ['state_name', 'district_name', unique_id]:
                        quarter_comparative_dict[key][
                            k] += data[i][k] if data[i][k] else 0
                    else:
                        quarter_comparative_dict[key][k] = data[i][k]
        data = []
        for _, v in quarter_comparative_dict.items():
            data.append(v)

        for i in range(0, len(data)):
            for k, v in data[i].items():
                if k not in ['state_name', 'district_name', unique_id
                             ] + latest_value_cols:
                    data[i][k] = handle_average(v)
    return data
示例#3
0
def calculate_aggregated_row(data, aggregation_level, data_format):
    aggregated_row = {}
    # for quarter we need to average summation
    if data_format == 'quarter':
        for k, v in data.items():
            aggregated_row[k] = handle_average(v) if v else 0

    else:
        for k, v in data.items():
            aggregated_row[k] = v if v else 0

    aggregated_row = calculate_percentage_single_row(deepcopy(aggregated_row))
    # rounding values
    for col in [
            'num_launched_districts', 'num_launched_blocks',
            'num_launched_states'
    ]:
        aggregated_row[col] = round(aggregated_row[col])
    aggregated_row = prepare_structure_aggregated_row(
        deepcopy(aggregated_row), aggregated_row['num_launched_states'],
        aggregation_level)
    return aggregated_row
    def quarter_wise(self, filters, order_by, aggregation_level):
        """
        :param filters: quaterwise filter (months in [month array])
        :param order_by: order by columns
        :return: excel_rows
        """
        headers_comprehensive, cols_comprehensive, headers_summary, cols_summary, cols_to_fetch = self.row_constants
        query_set = PoshanProgressReportView.objects.filter(
            **filters).order_by(*order_by)
        if not self.show_test:
            query_set = apply_exclude(self.config['domain'], query_set)
        all_cols = list(set(cols_comprehensive + cols_to_fetch))

        # it used to uniquely identify the row
        # for district wise data we need district id
        # for statewise we need state id
        unique_id = 'district_id'
        if aggregation_level == 1:
            unique_id = 'state_id'
        cols = cols_to_fetch[:]
        cols.append(unique_id)  # used as key for the dict
        data = query_set.values(*cols)
        row_data_dict = {}
        dummy_row = [0 for _ in range(0, len(all_cols))]

        latest_value_cols = [
            'num_launched_districts', 'num_launched_blocks',
            'num_launched_awcs'
        ]
        # update the dict
        # {'unique_id': [contains the excel row with sum of col values for all months eg. m1+m2+m3]}
        for row in data:
            launched = True if row['num_launched_awcs'] > 0 else False
            if row[unique_id] not in row_data_dict.keys():
                row_data_dict[row[unique_id]] = dummy_row[:]
            row_data = row_data_dict[row[unique_id]][:]
            for k, v in row.items():
                if k in ['state_name', 'district_name']:
                    row_data[all_cols.index(k)] = v
                elif k in latest_value_cols:
                    row_data[all_cols.index(k)] = max(
                        row_data[all_cols.index(k)], v if
                        (v and launched is True) else 0)
                elif k != unique_id:
                    row_data[all_cols.index(k)] += v if (
                        v and launched is True) else 0
            row_data_dict[row[unique_id]] = row_data

        # stores names and ids not numbers like state_name, id
        named_cols = ['state_name', 'district_name', unique_id]
        total_row = [0 for _ in range(0, len(all_cols))]

        # calculating average and getting total row
        # m1+m2+m3/3
        for k, v in row_data_dict.items():
            launched = True if v[all_cols.index(
                'num_launched_awcs')] > 0 else False
            for col in all_cols:
                if col not in named_cols:
                    val = v[all_cols.index(col)]
                    if col not in latest_value_cols:
                        val = handle_average(val)
                    row_data_dict[k][all_cols.index(col)] = val
                    total_row[all_cols.index(col)] += round(val) if (
                        val and launched is True) else 0
                else:
                    total_row[all_cols.index(col)] = 'Total'

        row_data_dict['total_row'] = total_row

        # calculating percentage
        # percent(current col) = 100 * (actual_value(prev col) / expected_value(prev prev col))
        for k, v in row_data_dict.items():
            row = v[:]
            row_data_dict[k] = self.__calculate_percentage_in_rows(
                row, all_cols)
            # marking all the unlaunched states as Not Launched
            if row_data_dict[k][all_cols.index('num_launched_awcs')] == 0:
                for col in all_cols:
                    if col not in named_cols:
                        row_data_dict[k][all_cols.index(col)] = 'Not Launched'

        # for district wise the number of launched districts are always one
        # so removing this column from report
        if aggregation_level == 2:
            headers_summary.remove('Number of Districts Covered')
            headers_comprehensive.remove('Number of Districts Covered')
            cols_summary.remove('num_launched_districts')
            cols_comprehensive.remove('num_launched_districts')

        if self.layout != 'comprehensive':
            headers = headers_summary
            for k, v in row_data_dict.items():
                row_data_dict[k] = [
                    v[all_cols.index(column)] for column in cols_summary
                ]
        else:
            headers = headers_comprehensive
            for k, v in row_data_dict.items():
                row_data_dict[k] = [
                    v[all_cols.index(column)] for column in cols_comprehensive
                ]

        excel_rows = [headers]
        for _, v in row_data_dict.items():
            excel_rows.append(v)
        return excel_rows
示例#5
0
    def quarter_wise(self, filters, order_by, aggregation_level):
        """
        :param filters: quaterwise filter (months in [month array])
        :param order_by: order by columns
        :return: excel_rows
        """
        headers_comprehensive, cols_comprehensive, headers_summary, cols_summary, cols_to_fetch = self.row_constants
        query_set = PoshanProgressReportView.objects.filter(
            **filters).order_by(*order_by)
        if not self.show_test:
            query_set = apply_exclude(self.config['domain'], query_set)
        all_cols = list(set(cols_comprehensive + cols_to_fetch))

        # it used to uniquely identify the row
        # for district wise data we need district id
        # for statewise we need state id
        unique_id = 'district_id'
        if aggregation_level == 1:
            unique_id = 'state_id'
        cols = cols_to_fetch[:]
        cols.append(unique_id)  # used as key for the dict
        data = query_set.values(*cols)
        row_data_dict = {}
        dummy_row = [0 for _ in range(0, len(all_cols))]
        headers = headers_comprehensive
        # update the dict
        # {'unique_id': [contains the excel row with sum of col values for all months eg. m1+m2+m3]}
        for row in data:
            if row[unique_id] not in row_data_dict.keys():
                row_data_dict[row[unique_id]] = dummy_row[:]
            row_data = row_data_dict[row[unique_id]][:]
            for k, v in row.items():
                if k in ['state_name', 'district_name']:
                    row_data[all_cols.index(k)] = v
                elif k != unique_id:
                    row_data[all_cols.index(k)] += v if v else 0
            row_data_dict[row[unique_id]] = row_data

        # calculating average
        # m1+m2+m3/3
        total_row = [0 for _ in range(0, len(all_cols))]
        for k, v in row_data_dict.items():
            for col in all_cols:
                if col not in ['state_name', 'district_name', unique_id]:
                    val = v[all_cols.index(col)]
                    row_data_dict[k][all_cols.index(col)] = handle_average(val)
                    total_row[all_cols.index(col)] += val if val else 0
                elif col in ['state_name', 'district_name']:
                    total_row[all_cols.index(col)] = 'Total'

        row_data_dict["total_row"] = total_row

        # calculating percentage
        # percent(current col) = 100 * (actual_value(prev col) / expected_value(prev prev col))
        for k, v in row_data_dict.items():
            row = v[:]
            row_data_dict[k] = self.__calculate_percentage_in_rows(
                row, all_cols)
            # rounding remaining values
            for col in ['num_launched_districts', 'num_launched_blocks']:
                row_data_dict[k][all_cols.index(col)] = round(
                    row_data_dict[k][all_cols.index(col)])

        if self.layout != 'comprehensive':
            headers = headers_summary
            for k, v in row_data_dict.items():
                row_data_dict[k] = [
                    v[all_cols.index(column)] for column in cols_summary
                ]
        else:
            for k, v in row_data_dict.items():
                row_data_dict[k] = [
                    v[all_cols.index(column)] for column in cols_comprehensive
                ]

        excel_rows = [headers]
        for _, v in row_data_dict.items():
            excel_rows.append(v)
        return excel_rows