Как группировать элементы списка из-за пользователя и с общим количеством раз, что пользователь сделал реестр?

Это моя дата:

db.define_table('usuarios',
                Field('nombre', 'string'),
                format='%(nombre)s'
                )

db.define_table('registro',
                Field('numero_documento', 'string'),
                Field('usuario', 'reference usuarios'),
                Field('fecha_ingreso', 'date'),
                format='%(numero_documento)s'
                )

я стараюсь доставать число раз, что пользователь наполнил реестр для этого такой том как основание, поле usuario внутри registro ; я перемещаю данные в список с этой функцией:

def pie_chart():
    query = (db.registro.id > 0)
    data = db(query).select(
        db.usuarios.nombre,
        left=(
            db.usuarios.on(db.usuarios.id==db.registro.usuario),
            )
    )
    new_data=[]
    for row in data:
        row_date = row['usuarios.nombre']
        tmp = [row_date]
        new_data.append(tmp)
    return dict(data=new_data)

с которой он возвращает мне эту дату:

introducir la descripción de la imagen aquí

он старался складывать и группировать число реестров из-за такого пользователя:

series = []
    cantidad_usuarios = {}
    for line in data:
        usuario = line.usuarios.nombre
        if  usuario not in cantidad_usuarios:
            cantidad_usuarios[usuario] = [0]
        cantidad_usuarios[usuario] += 1
    for nombre, cantidades in cantidad_usuarios.items():
        series.append({
            'name': nombre,
            'data': cantidades
        })

но оно я не функционирует.

2
задан 13.04.2016, 20:43
2 ответа

То, что я сделал бы, что-то сходное ответ, который я дал тебе ранее, но ориентируемый на Ногу Диаграмма.

Идея здесь проще, состоит в том, чтобы рассказывать просто общее количество документов из-за каждого пользователя:

import json    

def grafica():
    registros = db(db.registro.id > 0).select(
        db.usuarios.nombre,
        left=(
            db.usuarios.on(db.usuarios.id==db.registro.usuario),
        )
    )
    usuarios = {}
    for registro in registros:
        nombre = registro.nombre
        if nombre not in usuarios:
            usuarios[nombre] = 0
        usuarios[nombre] += 1

    # Pasarlo al formato de Highcharts
    data = []
    for nombre, total in usuarios.items():
        data.append({
            'name': nombre,
            'y': total
        })

    # Los parámetros para el Pie Chart incluyendo la data que calculamos arriba
    parametros = {
        'chart': {
            'plotBackgroundColor': None,
            'plotBorderWidth': None,
            'plotShadow': False,
            'type': 'pie'
        },
        'title': {
            'text': 'Documentos totales por Usuario'
        },
        'tooltip': {
            'pointFormat': '{series.name}: <b>{point.y:.1f}</b>'
        },
        'plotOptions': {
            'pie': {
                'allowPointSelect': True,
                'cursor': 'pointer',
                'dataLabels': {
                    'enabled': True,
                    'format': '<b>{point.name}</b>: {point.percentage:.1f} %',
                }
            }
        },
        'series': [{
            'name': 'Total documentos',
            'colorByPoint': True,
            'data': data
        }]
    }
    parametros = json.dumps(parametros)
    return dict(parametros=parametros)

В конце концов, в тебе сдержись:

{{extend 'layout.html'}}
<div id="container" style="min-width: 300px; max-width: 800px; height: 400px; margin: 0 auto"></div>

<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://code.highcharts.com/modules/exporting.js"></script>
<script type="text/javascript">
    $(document).ready(function() {
        var parametros = JSON.parse('{{=XML(parametros)}}');
        $('#container').highcharts(parametros);
    });
</script>

Результат был бы чем-то как это:

introducir la descripción de la imagen aquí

Оно является общим процентным содержанием для каждого пользователя и деталью общего количества документов из-за каждого пользователя.

2
ответ дан 24.11.2019, 14:35

Ты можешь использовать словарь, который группировал бы ее informaciГіn,

data = [["Usuario B"],["Usuario A"], ["Usuario B"], ["Usuario B"],["Usuario A"]] #para emular tu consulta

from collections import defaultdict
def indexOn( data):
    inx= defaultdict(list)
    for t in data:
            inx[t[0]].append(t)
    return inx

sortData = indexOn(data)

Это дает тебе группируемый результат каждого элемента Одинокие

>>> defaultdict(<type 'list'>, {'Usuario A': [['Usuario A'], ['Usuario A']], 'Usuario B': [['Usuario B'], ['Usuario B'], ['Usuario B']]}

ты нуждаешься в том, чтобы пробежать это и получить длину каждого ключа словаря

for key in sortData: 
    series.append({
        'name': key,
        'data': sortData[key].__len__()
    })
3
ответ дан 24.11.2019, 14:35

Теги

Похожие вопросы