Сгруппируйте набор запросов Django по значению с пандами - PullRequest
0 голосов
/ 11 апреля 2019

Я работаю над сценарием, чтобы сгруппировать набор запросов Django по полю.

EntryExitLog модель:

camera = models.ForeignKey(Camera, on_delete=models.CASCADE, null=True, blank=True)
# Person - Will have values for member, and null for non member log
person = models.ForeignKey(Person, on_delete=models.CASCADE, null=True, blank=True)
created_user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True) 
entry_time = models.DateTimeField(blank=True, null=True)
exit_time = models.DateTimeField(blank=True, null=True)

Я хочу сгруппировать журналы по created_user и камере для всех участников и не членов. Я новичок в пандах, сгруппированных со следующим кодом,

import pandas

log_qs = EntryExitLog.objects.filter(Q(entry_time__range=(from_date, to_date)) | \
                                     Q(exit_time__range=(from_date, to_date)))
log_data_dict = {}
for i, log in enumerate(log_qs):
    log_data_dict[str(i)] = {}
    log_data_dict[str(i)]['company'] = log.camera.user.company.name if log.camera.user.company else None
    log_data_dict[str(i)]['name'] = log.created_user.name
    log_data_dict[str(i)]['email_id'] = log.created_user.email_id
    log_data_dict[str(i)]['camera_name'] = log.camera.nick_name if log.camera.nick_name else None
    log_data_dict[str(i)]['camera_id'] = log.camera.camera_id
    log_data_dict[str(i)]['person_id'] = log.person.id if log.person else None


data_frame = pandas.DataFrame.from_dict(log_data_dict, orient='index')
print(data_frame.groupby('email_id').groups))

просто интересно получить желаемый результат,

{
    'user_email1': {
        'camera_name1': {'members': 10, 'non_members': 3, 'total_count': 13},
        'camera_name2': {'members': 100, 'non_members': 20, 'total_count': 120}
    },
    'user_email2': {
        'camera_name1': {'members': 150, 'non_members': 30, 'total_count': 180},
        'camera_name2': {'members': 190, 'non_members': 10, 'total_count': 200}
    }
}

1 Ответ

0 голосов
/ 11 апреля 2019

Рад поделиться решением,

data_frame = pandas.DataFrame.from_dict(log_data_dict, orient='index')
# Fill Nan with None
data_frame = data_frame.where((pandas.notnull(data_frame)), None)

log_data_dict = {}
for email_id, log_data in data_frame.groupby('email_id'):
    log_data_dict[email_id] = {}
    member_count = 0
    non_member_count = 0

    for _, log in log_data.to_dict('index').items():
        if log['person_id']:
            member_count += 1
        else:
            non_member_count += 1

    log_data_dict[email_id]['summary'] = {}
    log_data_dict[email_id]['summary']['member_count'] = member_count
    log_data_dict[email_id]['summary']['non_member_count'] = non_member_count
    log_data_dict[email_id]['summary']['total_count'] = member_count + non_member_count

print(log_data_dict)

Но хотелось бы сделать это как можно короче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...