Я занимаюсь созданием функции, которая выбирает и возвращает данные, которые будут использоваться графиком временных рядов, все необходимые данные хранятся в одной модели. В настоящее время моя функция будет запрашивать и извлекать данные на основе установленных дат, Затем вызывать функцию в конце, чтобы сгруппировать повторяющиеся данные ниже представлены две отдельные функции
def get_system_endpoint_response_time(system_id, start_date, end_date):
"""
Returns the response time of every endpoint for a specific system
@param end_date: End date of the period of which the data is to be extracted
@type:str
@param start_date: Start point of the data to be presented
@type: str
@param: system_id: Id of the system
@type system_id: str
@return: Response code indicating status and response time graph data
"""
try:
system = SystemService().get(pk = system_id, state__name = 'Active')
if not system:
return {'code': '800.400.200'}
now = timezone.now()
start_date = dateutil.parser.parse(start_date)
end_date = dateutil.parser.parse(end_date)
period = start_date - end_date
labels = []
label = []
dataset = []
if period.days <= 31:
for i in range(0, 31):
current_day = now - timedelta(days = i, hours = 0, minutes = 0)
past_day = current_day + timedelta(days = 1)
response_times = list(SystemMonitorService().filter(
system = system, date_created__lte = past_day,
date_created__gte = current_day).values(
name = F('endpoint__name'), responseTime = F('response_time'),
dateCreated = F('date_created')))
past_day = past_day.replace(hour = 0, minute = 0)
label.append(past_day.strftime("%m/%d/%y %H:%M"))
result = {"Initial": {"data": [0]}}
for response_time in response_times:
response_time.update(
responseTime = timedelta.total_seconds(response_time.get('responseTime')),
dateCreated = response_time["dateCreated"].strftime("%m/%d/%y %H:%M")
)
dataset.append(response_time)
labels.append(response_time['dateCreated'])
if dataset:
result = join_repetitive_dictionaries(dataset)
return {'code': '800.200.001', 'data': {'labels': label, 'datasets': result}}
Функция группировки данных
def join_repetitive_dictionaries(data):
"""
@param data: a dictionary holding data
@type: dict
@return:
"""
result = {}
for row in data:
if row["name"] in result:
result[row["name"]]["data"].append(row["responseTime"])
result[row["name"]]["dateCreated"].append(row["dateCreated"])
else:
result[row["name"]] = {
"label": row["name"],
"data": [row["responseTime"]],
"dateCreated": [row["dateCreated"]],
}
return result
это пример возврата get_system_endpoint_response_time
{
"code": "800.200.001",
"data": {
"labels": [
"01/29/20 00:00",
"01/28/20 00:00",
"01/27/20 00:00",
"01/26/20 00:00",
"01/25/20 00:00",
"01/24/20 00:00",
"01/23/20 00:00",
"01/22/20 00:00",
"01/21/20 00:00",
"01/20/20 00:00",
"01/19/20 00:00",
"01/18/20 00:00",
"01/17/20 00:00",
"01/16/20 00:00",
"01/15/20 00:00",
"01/14/20 00:00",
"01/13/20 00:00",
"01/12/20 00:00",
"01/11/20 00:00",
"01/10/20 00:00",
"01/09/20 00:00",
"01/08/20 00:00",
"01/07/20 00:00",
"01/06/20 00:00",
"01/05/20 00:00",
"01/04/20 00:00",
"01/03/20 00:00",
"01/02/20 00:00",
"01/01/20 00:00",
"12/31/19 00:00",
"12/30/19 00:00"
],
"datasets": {
"Github": {
"dateCreated": [
"01/27/20 08:08",
"01/27/20 08:54",
"01/27/20 11:47",
"01/20/20 13:53",
"01/20/20 13:53"
],
"data": [
1.0,
0.0,
1.0,
1.0,
1.0
],
"label": "Github"
},
"Stack Overflow": {
"dateCreated": [
"01/27/20 08:08",
"01/27/20 08:54",
"01/27/20 11:47",
"01/20/20 13:53"
],
"data": [
0.0,
1.0,
1.0,
0.0
],
"label": "Stack Overflow"
},
"Linked In": {
"dateCreated": [
"01/27/20 08:08",
"01/27/20 08:54",
"01/27/20 11:47",
"01/20/20 13:53",
"01/20/20 13:53"
],
"data": [
0.0,
0.0,
0.0,
0.0,
0.0
],
"label": "Linked In"
},
"Devrant": {
"dateCreated": [
"01/27/20 08:08",
"01/27/20 08:54",
"01/27/20 11:47"
],
"data": [
1.0,
1.0,
1.0
],
"label": "Devrant"
},
"Plural Sight": {
"dateCreated": [
"01/27/20 08:08",
"01/27/20 08:54",
"01/27/20 11:47"
],
"data": [
0.0,
0.0,
0.0
],
"label": "Plural Sight"
},
"Gmail": {
"dateCreated": [
"01/27/20 08:08",
"01/27/20 08:54",
"01/27/20 11:47"
],
"data": [
0.0,
0.0,
0.0
],
"label": "Gmail"
}
}
}
}
Я хочу добавить отсутствующие даты со значением 0 в каждую сгруппированную данные вроде так
"labels": [
"01/29/20 00:00",
"01/28/20 00:00",
"01/27/20 00:00",
"01/26/20 00:00",
"01/25/20 00:00",
"01/24/20 00:00",
"01/23/20 00:00",
"01/22/20 00:00",
"01/21/20 00:00",
"01/20/20 00:00",
"01/19/20 00:00",
"01/18/20 00:00",
"01/17/20 00:00",
"01/16/20 00:00",
"01/15/20 00:00",
"01/14/20 00:00",
"01/13/20 00:00",
"01/12/20 00:00",
"01/11/20 00:00",
"01/10/20 00:00",
"01/09/20 00:00",
"01/08/20 00:00",
"01/07/20 00:00",
"01/06/20 00:00",
"01/05/20 00:00",
"01/04/20 00:00",
"01/03/20 00:00",
"01/02/20 00:00",
"01/01/20 00:00",
"12/31/19 00:00",
"12/30/19 00:00"
],
"datasets": {
"Github": {
"dateCreated": [
"01/28/20 00:00",
"01/27/20 08:08",
"01/27/20 08:54",
"01/27/20 11:47",
"01/20/20 13:53",
"01/20/20 13:53",
"01/29/20 00:00",
"01/26/20 00:00",
"01/25/20 00:00",
"01/24/20 00:00",
"01/23/20 00:00",
"01/22/20 00:00",
"01/21/20 00:00",
"01/20/20 00:00",
"01/19/20 00:00",
........
],
"data": [
1.0,
0.0,
1.0,
1.0,
1.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
.....
],
....
}
Может ли кто-нибудь помочь ??