格式化要在图表中显示的数据点列表
Format list of data points to display in graph
我正在 Django Rest Framework 中编写一个 API 端点,并希望为图形格式化数据。我从数据库中得到这样的数据:
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": ['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]
}
]
]
我正在尝试以这种方式格式化数据,但我做不到。是否有任何内置函数可用于使数据格式正确?
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,
}
)
为了获得唯一的标签,set comprehension
can be used. Then you can use defaultdict
到 key:value
对,因为每个状态是键名和计数是对应的值。
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
看起来像:
{'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]}]}
为了用零填充小型列表,请参阅 。
基于 Rustam 的回答:
- 添加字典
label_to_idx
用于按标签确定索引。
- 将
lambda
函数传递给 defaultdict
以初始化正确大小和默认值的列表。
- 为每个状态填充
d
,使用 label_to_idx
找到正确的索引以填充计数。
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']}
我正在 Django Rest Framework 中编写一个 API 端点,并希望为图形格式化数据。我从数据库中得到这样的数据:
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": ['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]
}
]
]
我正在尝试以这种方式格式化数据,但我做不到。是否有任何内置函数可用于使数据格式正确?
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,
}
)
为了获得唯一的标签,set comprehension
can be used. Then you can use defaultdict
到 key:value
对,因为每个状态是键名和计数是对应的值。
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
看起来像:
{'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]}]}
为了用零填充小型列表,请参阅
基于 Rustam 的回答:
- 添加字典
label_to_idx
用于按标签确定索引。 - 将
lambda
函数传递给defaultdict
以初始化正确大小和默认值的列表。 - 为每个状态填充
d
,使用label_to_idx
找到正确的索引以填充计数。
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']}