Написание функции с использованием панд и возвращение данных в требуемом формате - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть total_of_each_error фрейм данных:

    month        name       errors     count
0   January     ABCD        Big         1
1   January     ABCD      Monitoring    3
2   January     WORLD     Small         1
3   January     Channel    Big          2
4   January     Channel   Small         1
5   January     Channel  Monitoring     1
6   January     AVR      Monitoring     1
7   March       WORLD     Monitoring    2
8   April       Migration    Big        1
9   April       Migration Monitoring    2
10  May         P&G       Small         1
11  May         P&G       Monitoring    1
12  May         ABCD      Monitoring    1
13  May         WORLD    Improvement    1
14  June        P&G      Monitoring     1
15  June        ABCD         Small      1
16  June        ABCD     Monitoring     1

Я написал эту функцию:

import pandas as pd
from itertools import product

def get_chartdata(df):
    months = df['month'].unique().tolist()
    no_of_errors = df['errors'].unique().tolist()
    name = df['name'].unique().tolist()
    cross_df = pd.DataFrame(list(product(months, name, no_of_errors)), columns=['month','name','errors'])
    merged_df = pd.merge(total_of_each_error,cross_df,how='outer', left_on=['month','name','errors'], 
         right_on=['month','name','errors']).drop_duplicates().fillna(0)            

    pivot_df = merged_df.pivot_table(columns='month', index=['name','errors'], values='count', fill_value=0).reset_index() 
    data = {}
    for index, row in pivot_df.iterrows():
        if (row['name']) not in data.keys():
            data[row['name']] = []
        data[row['name']].append({'name':row.values[1:2].tolist() , 'data': row.values[2:].tolist()})


    x_axis = {}
    for i in pivot_df['name'].unique():
        df1 = pivot_df[pivot_df['name'] == i]
        x_axisData = pivot_df.columns[2:].unique()
        x_axis[i] = {'categories': x_axisData.tolist()}    
    return data, x_axis

print(get_chartdata(total_of_each_error)) печатает следующее:

({'P&G': [{'name': ['Big'], 'data': [0, 0, 0, 0, 0]}, {'name': ['Small'], 'data': [0, 0, 0, 0, 1]}, {'name': ['Monitoring'], 'data': [0, 0, 1, 0, 1]}, {'name': ['Improvement'], 'data': [0, 0, 0, 0, 0]}],
  'ABCD': [{'name': ['Big'], 'data': [0, 1, 0, 0, 0]}, {'name': ['Small'], 'data': [0, 0, 1, 0, 0]}, {'name': ['Monitoring'], 'data': [0, 3, 1, 0, 1]}, {'name': ['Improvement'], 'data': [0, 0, 0, 0, 0]}],
  'WORLD': [{'name': ['Big'], 'data': [0, 0, 0, 0, 0]}, {'name': ['Small'], 'data': [0, 1, 0, 0, 0]}, {'name': ['Monitoring'], 'data': [0, 0, 0, 2, 0]}, {'name': ['Improvement'], 'data': [0, 0, 0, 0, 1]}],
  'Migration': [{'name': ['Big'], 'data': [1, 0, 0, 0, 0]}, {'name': ['Small'], 'data': [0, 0, 0, 0, 0]}, {'name': ['Monitoring'], 'data': [2, 0, 0, 0, 0]}, {'name': ['Improvement'], 'data': [0, 0, 0, 0, 0]}],
  'Channel': [{'name': ['Big'], 'data': [0, 2, 0, 0, 0]}, {'name': ['Small'], 'data': [0, 1, 0, 0, 0]}, {'name': ['Monitoring'], 'data': [0, 1, 0, 0, 0]}, {'name': ['Improvement'], 'data': [0, 0, 0, 0, 0]}],
  'AVR': [{'name': ['Big'], 'data': [0, 0, 0, 0, 0]}, {'name': ['Small'], 'data': [0, 0, 0, 0, 0]}, {'name': ['Monitoring'], 'data': [0, 1, 0, 0, 0]}, {'name': ['Improvement'], 'data': [0, 0, 0, 0, 0]}]},
 {'P&G': {'categories': ['April', 'January', 'June', 'March', 'May']}, 'ABCD': {'categories': ['April', 'January', 'June', 'March', 'May']},
  'WORLD': {'categories': ['April', 'January', 'June', 'March', 'May']},
  'Migration': {'categories': ['April', 'January', 'June', 'March', 'May']},
  'Channel': {'categories': ['April', 'January', 'June', 'March', 'May']},
  'AVR': {'categories': ['April', 'January', 'June', 'March', 'May']}})

Я получаю categories как ['April', 'January', 'June', 'March', 'May'], но я хочу, чтобы он был ['January', 'March', 'April', 'May', 'June'], и data также должен соответствовать этому порядку.

Я создаю диаграммы с использованием Highcharts и передаю вышеуказанные данные в шаблон Django. Пример диаграммы на https://jsfiddle.net/nbtejvau/9/

Редактировать : Добавлен тег Highcharts.

Ожидаемый результат:

data = {'WORLD': {'categories': ['January', 'March', 'April', 'May', 'June'],
                'series': [{
                    'name': 'Big',
                    'data': [0, 0, 0, 0, 0]  # Number of Bigs in those months
                    }, {
                    'name': 'Small',
                    'data': [1, 0, 0, 0, 0]  # Number of Smalls in those months
                    }, {
                    'name': 'Monitoring',
                    'data': [0, 2, 0, 0, 0]  # Number of Monitorings in those months
                    }, {
                    'name': 'Improvement',
                    'data': [0, 0, 0, 1, 0]  # Number of Improvements in those months
                    }]
                },
        'P&G': {'categories': ['January', 'March', 'April', 'May', 'June'],
                'series': [{
                    'name': 'Big',
                    'data': [0, 0, 0, 0, 0]
                    }, {
                    'name': 'Small',
                    'data': [0, 0, 0, 1, 0]
                    }, {
                    'name': 'Monitoring',
                    'data': [0, 2, 0, 0, 0]
                    }, {
                    'name': 'Improvement',
                    'data': [0, 0, 0, 1, 0]
                    }]
                }      

    }

Аналогичный выход ожидается для оставшихся в total_of_each_error['name']

1 Ответ

0 голосов
/ 16 сентября 2018

Добавлена ​​логика обмена в ваш окончательный набор данных,

data = {'P&G': [{'name': ['Big'], 'data': [0, 0, 0, 0, 0]},
                {'name': ['Small'], 'data': [0, 0, 0, 0, 1]},
                {'name': ['Monitoring'], 'data': [0, 0, 1, 0, 1]},
                {'name': ['Improvement'], 'data': [0, 0, 0, 0, 0]}],
        'ABCD': [{'name': ['Big'], 'data': [0, 1, 0, 0, 0]},
                 {'name': ['Small'], 'data': [0, 0, 1, 0, 0]},
                 {'name': ['Monitoring'], 'data': [0, 3, 1, 0, 1]},
                 {'name': ['Improvement'], 'data': [0, 0, 0, 0, 0]}],
        'WORLD': [{'name': ['Big'], 'data': [0, 0, 0, 0, 0]},
                  {'name': ['Small'], 'data': [0, 1, 0, 0, 0]},
                  {'name': ['Monitoring'], 'data': [0, 0, 0, 2, 0]},
                  {'name': ['Improvement'], 'data': [0, 0, 0, 0, 1]}],
        'Migration': [{'name': ['Big'], 'data': [1, 0, 0, 0, 0]},
                      {'name': ['Small'], 'data': [0, 0, 0, 0, 0]},
                      {'name': ['Monitoring'], 'data': [2, 0, 0, 0, 0]},
                      {'name': ['Improvement'], 'data': [0, 0, 0, 0, 0]}],
        'Channel': [{'name': ['Big'], 'data': [0, 2, 0, 0, 0]},
                    {'name': ['Small'], 'data': [0, 1, 0, 0, 0]},
                    {'name': ['Monitoring'], 'data': [0, 1, 0, 0, 0]},
                    {'name': ['Improvement'], 'data': [0, 0, 0, 0, 0]}],
        'AVR': [{'name': ['Big'], 'data': [0, 0, 0, 0, 0]},
                {'name': ['Small'], 'data': [0, 0, 0, 0, 0]},
                {'name': ['Monitoring'], 'data': [0, 1, 0, 0, 0]},
                {'name': ['Improvement'], 'data': [0, 0, 0, 0, 0]}]}

x_axis = {'P&G': {'categories': ['April', 'January', 'June', 'March', 'May']},
          'ABCD': {'categories': ['April', 'January', 'June', 'March', 'May']},
          'WORLD': {'categories': ['April', 'January', 'June', 'March', 'May']},
          'Migration': {'categories': ['April', 'January', 'June', 'March', 'May']},
          'Channel': {'categories': ['April', 'January', 'June', 'March', 'May']},
          'AVR': {'categories': ['April', 'January', 'June', 'March', 'May']}}

target_month_order = ['January', 'March', 'April', 'May', 'June']

final_data = dict()
for name in x_axis.keys():
    # Modifying data1
    final_data[name] = dict()
    final_data[name]['categories'] = target_month_order
    # Modifying data2
    final_data[name]['series'] = list()
    print('Swapping - ', name)
    actual_month_order = x_axis[name]['categories']
    swap_index = [actual_month_order.index(month) for month in target_month_order]
    _tmp = data[name]
    for _val in _tmp:
        _new_list = []
        for swap_idx in swap_index:
            _new_list.append(_val['data'][swap_idx])
        # print(list(zip(actual_month_order, _val['data'])))
        # print(list(zip(target_month_order, _new_list)))
        final_data[name]['series'].append({'name': _val['name'], 'data': _new_list})
        print('--')
    # print(swap_index)
    # print(final_data[name]['series'])

print(' *-*' * 20)
import pprint
pprint.pprint(final_data)

выход

 *-* *-* *-* *-* *-* *-* *-* *-* *-* *-* *-* *-* *-* *-* *-* *-* *-* *-* *-* *-*
{'ABCD': {'categories': ['January', 'March', 'April', 'May', 'June'],
          'series': [{'data': [1, 0, 0, 0, 0], 'name': ['Big']},
                     {'data': [0, 0, 0, 0, 1], 'name': ['Small']},
                     {'data': [3, 0, 0, 1, 1], 'name': ['Monitoring']},
                     {'data': [0, 0, 0, 0, 0], 'name': ['Improvement']}]},
 'AVR': {'categories': ['January', 'March', 'April', 'May', 'June'],
         'series': [{'data': [0, 0, 0, 0, 0], 'name': ['Big']},
                    {'data': [0, 0, 0, 0, 0], 'name': ['Small']},
                    {'data': [1, 0, 0, 0, 0], 'name': ['Monitoring']},
                    {'data': [0, 0, 0, 0, 0], 'name': ['Improvement']}]},
 'Channel': {'categories': ['January', 'March', 'April', 'May', 'June'],
             'series': [{'data': [2, 0, 0, 0, 0], 'name': ['Big']},
                        {'data': [1, 0, 0, 0, 0], 'name': ['Small']},
                        {'data': [1, 0, 0, 0, 0], 'name': ['Monitoring']},
                        {'data': [0, 0, 0, 0, 0], 'name': ['Improvement']}]},
 'Migration': {'categories': ['January', 'March', 'April', 'May', 'June'],
               'series': [{'data': [0, 0, 1, 0, 0], 'name': ['Big']},
                          {'data': [0, 0, 0, 0, 0], 'name': ['Small']},
                          {'data': [0, 0, 2, 0, 0], 'name': ['Monitoring']},
                          {'data': [0, 0, 0, 0, 0], 'name': ['Improvement']}]},
 'P&G': {'categories': ['January', 'March', 'April', 'May', 'June'],
         'series': [{'data': [0, 0, 0, 0, 0], 'name': ['Big']},
                    {'data': [0, 0, 0, 1, 0], 'name': ['Small']},
                    {'data': [0, 0, 0, 1, 1], 'name': ['Monitoring']},
                    {'data': [0, 0, 0, 0, 0], 'name': ['Improvement']}]},
 'WORLD': {'categories': ['January', 'March', 'April', 'May', 'June'],
           'series': [{'data': [0, 0, 0, 0, 0], 'name': ['Big']},
                      {'data': [1, 0, 0, 0, 0], 'name': ['Small']},
                      {'data': [0, 2, 0, 0, 0], 'name': ['Monitoring']},
                      {'data': [0, 0, 0, 1, 0], 'name': ['Improvement']}]}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...