Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

187
Views
Dar formato a la lista de puntos de datos para mostrar en el gráfico

Estoy escribiendo un punto final de API en Django Rest Framework y quiero formatear datos para un gráfico. Tengo datos como este que obtengo de la base de datos:

 data = [ { "name": "Test 3", "status": "Active", "count": 1 }, { "name": "Test 2", "status": "Failed", "count": 1 }, { "name": "Test", "status": "In Progress", "count": 85 }, { "name": "Test", "status": "Failed", "count": 40 }, { "name": "Test", "status": "Active", "count": 1 }, { "name": "Test", "status": "Success", "count": 218 }, { "name": "Test 2", "status": "Active", "count": 1 } ]

Quiero formatear los datos del gráfico final desde arriba de esta manera para mostrarlo en el gráfico:

 [ "labels": ['Test', 'Test 2', 'Test 3'], "data": [ { name: 'Active', data: [1, 1, 1] }, { name: 'Failed', data: [40, 1, 0] }, { name: 'Success', data: [218, 0, 0] }, { name: 'In Progress', data: [85, 0, 0] } ] ]

Estoy tratando de formatear los datos de esa manera, pero no puedo hacerlo. ¿Hay alguna función integrada que pueda usar para corregir el formato de datos?

 response = [ { 'labels': [], 'data': [], } ] for row in data: if row['name'] not in response[0]['labels']: response[0]['labels'].append(row['name']) innerData = [] for status in ['Active', 'Failed', 'Success', 'In Progress']: if status in row['status']: innerData.append(row['count']) else: innerData.append(0) response[0]['data'].append( { 'name': status, 'data': innerData, } )
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Sobre la base de la respuesta de Rustam:

  1. Agregue un diccionario label_to_idx que se usará para determinar el índice por etiqueta.
  2. Pase una función lambda a defaultdict para inicializar listas de tamaño correcto y valor predeterminado.
  3. Complete d para cada estado, usando label_to_idx para encontrar el índice correcto para completar con el conteo.
 from collections import defaultdict data = [ {"name": "Test 3", "status": "Active", "count": 1}, {"name": "Test 2", "status": "Failed", "count": 1}, {"name": "Test", "status": "In Progress", "count": 85}, {"name": "Test", "status": "Failed", "count": 40}, {"name": "Test", "status": "Active", "count": 1}, {"name": "Test", "status": "Success", "count": 218}, {"name": "Test 2", "status": "Active", "count": 1}, ] labels = sorted({each['name'] for each in data}) label_to_idx = {label: idx for idx, label in enumerate(labels)} # Added d = defaultdict(lambda: [0] * len(labels)) # Modified for each in data: d[each['status']][label_to_idx[each['name']]] = each['count'] # Modified final_result = {'labels': labels, 'data': []} for k, v in d.items(): final_result['data'].append({'name': k, 'data': v})
 from pprint import pprint as pp pp(final_result) # {'data': [{'data': [1, 1, 1], 'name': 'Active'}, # {'data': [40, 1, 0], 'name': 'Failed'}, # {'data': [85, 0, 0], 'name': 'In Progress'}, # {'data': [218, 0, 0], 'name': 'Success'}], # 'labels': ['Test', 'Test 2', 'Test 3']}
over 4 years ago · Santiago Trujillo Report

0

Para obtener etiquetas únicas, se puede utilizar set comprehension . Luego, puede usar el defaultdict para el par key:value , ya que cada estado es el nombre clave y el recuento son los valores correspondientes.

 from collections import defaultdict data = [{"name": "Test 3", "status": "Active", "count": 1}, {"name": "Test 2", "status": "Failed", "count": 1}, {"name": "Test", "status": "In Progress", "count": 85},{"name": "Test", "status": "Failed", "count": 40},{"name": "Test", "status": "Active", "count": 1},{"name": "Test", "status": "Success", "count": 218}, {"name": "Test 2", "status": "Active", "count": 1}] d = defaultdict(list) labels = sorted({each['name'] for each in data}) for each in data: d[each['status']].append(each['count']) # -> defaultdict(<class 'list'>, {'Active': [1, 1, 1], 'Failed': [1, 40], 'In Progress': [85], 'Success': [218]}) final_result = {'labels': labels, 'data': []} for k, v in d.items(): final_result['data'].append({'name': k, 'data': v})

final_result se vería así:

 {'labels': ['Test', 'Test 2', 'Test 3'], 'data': [{'name': 'Active', 'data': [1, 1, 1]}, {'name': 'Failed', 'data': [1, 40]}, {'name': 'In Progress', 'data': [85]}, {'name': 'Success', 'data': [218]}]}

Para llenar listas pequeñas con ceros, consulte esta respuesta .

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!