Как построить время работы приложения, используя время простоя и даты?

В файле CSV у меня есть даты, время простоя и номера инцидентов моего приложения. На основе приведенных ниже данных я должен построить график времени безотказной работы моего приложения с использованием Python. Время безотказной работы за последние 7 дней, время безотказной работы за последние 30 дней и время безотказной работы за последние 90 дней.

дата время простоя (часы) инцидент 2022-10-05 2 abc123 2022-10-05 3 abc124 2022-09-01 4 абв100 2022-08-26 8 abc99 2022-08-24 5 abc98 2022-07-15 6 abc90 2022-06-09 4 abc85

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

downtime_by_incident = data.groupby(["date", "incident"])['downtime].sum().unstack().plot(kind = "bar", stacked=True, xlabel = "", legend=False).get_figure()
downtime_by_incident.savefig("downtime_by_incident.jpg", bbox_inches = "tight")

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

Как должен выглядеть график безотказной работы? Укажите ожидаемый результат на основе данных примера.

It_is_Chris 07.11.2022 22:37

Это вызов. Я не могу представить, как представить эти данные на графике. Я пытался визуализировать с помощью линейного графика, но не мог нарисовать

Hound 07.11.2022 22:46

Я бы использовал график штрих-кода. Вы можете инвертировать, взорвав время, а затем инвертировав.

ifly6 07.11.2022 22:48

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

It_is_Chris 07.11.2022 22:48

Да, это правильно. Приложение было запущено и работало в пропущенные даты

Hound 07.11.2022 22:52
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

# convert to datetime
df['date'] = pd.to_datetime(df['date'])
# groupby date and sum downtime then merge on a new Frame you create
# that fills in the missing dates
m = df.groupby('date')['downtime(hrs)'].sum().reset_index().merge(pd.DataFrame(pd.date_range(df['date'].min(),
                                                                                             df['date'].max()),
                                                                               columns=['date']),
                                                                  on='date', how='right').fillna(0)
# calculate the uptime (24 hours - downtime hours) for each day
m['uptime'] = 24 - m['downtime(hrs)']
# bar plot
m[['date', 'uptime']].set_index('date').plot(kind='bar', figsize=(20,10))

# line plot
m[['date', 'uptime']].set_index('date')['uptime'].plot(figsize=(20,10))

# stacked bar plot
m.set_index('date').plot(kind='bar', stacked=True, figsize=(20,10))

Обратите внимание, что вам, вероятно, следует обновить эту строку:

pd.DataFrame(pd.date_range(df['date'].min(), df['date'].max()), columns=['date'])

быть сегодня и не в последний день в твоем первом кадре

pd.DataFrame(pd.date_range(df['date'].min(), datetime.datetime.today()), columns=['date'])

Большое спасибо за код. Извините, что задаю еще один вопрос, если в один и тот же день произойдет два инцидента, и оба, вероятно, заняли около 18 и 20 часов соответственно. Когда мы строим точку графика для этого дня, уменьшая значение с 24, значение фактически уменьшается, тогда как на самом деле оно должно равняться только 0. Как я могу справиться с этим с помощью приведенного выше кода?

Hound 07.11.2022 23:25
Ответ принят как подходящий

Один из способов сделать это — создать второй набор данных для отслеживания времени безотказной работы, дополняющий ваш текущий набор данных, который отслеживает время простоя.

import pandas as pd
import numpy as np
from io import StringIO
import plotly.express as px

df = pd.read_csv(StringIO('''date   downtime(hrs)   incident
2022-10-05  2   abc123
2022-10-05  3   abc124
2022-09-01  4   abc100
2022-08-26  8   abc99
2022-08-24  5   abc98
2022-07-15  6   abc90
2022-06-09  4   abc85'''), sep='\t')

df['date'] = pd.to_datetime(df['date'])

df2 = pd.DataFrame({'date':pd.date_range(df['date'].min(), df['date'].max(),freq='d')}).assign(tot_hours=24)

df2 = pd.merge(df2, df[['date', 'downtime(hrs)']].groupby('date').sum().reset_index(), how='left')

df2['uptime'] = df2['tot_hours'] - df2['downtime(hrs)'].fillna(0)

#if there's any negative downtime, impute to zero
df2['uptime'] = np.where(df2['uptime']<0, 0, df2['uptime'])

fig = px.line(df2,
          x='date',
          y='uptime')

fig.show()

С фактическим набором данных вы можете найти последние времена безотказной работы следующим образом:

for n in [7,30,90]:
    n_days_ago = pd.to_datetime('today').normalize()-pd.Timedelta(n, unit='d')
    today = pd.to_datetime('today').normalize()
    df2.loc[df2['date'].between(n_days_ago, today), 'uptime'].sum()

#output
0.0
0.0
1370.0

Большое спасибо за код. Извините, что задаю еще один вопрос, если в один и тот же день произойдет два инцидента, и оба, вероятно, заняли около 18 и 20 часов соответственно. Когда мы строим точку графика для этого дня, уменьшая значение с 24, значение фактически уменьшается, тогда как на самом деле оно должно равняться только 0. Как я могу справиться с этим с помощью приведенного выше кода?

Hound 07.11.2022 23:24

Хороший вопрос. Самый простой способ — приписать любое отрицательное значение нулю. Я обновил ответ, чтобы учесть эту возможность.

amance 07.11.2022 23:29

Благодаря тонну. Последний вопрос (извините, я новичок в пандах). Как я могу ограничить график только 30 днями? Другими словами, постройте график времени безотказной работы за последние 30 дней.

Hound 07.11.2022 23:50

Без проблем. Вы могли бы сделать fig = px.line(df2[df2['date'].between(pd.to_datetime('today').norm‌​alize()-pd.Timedelta‌​(30, unit='d'), pd.to_datetime('today').normalize())], x='date', y='uptime')

amance 07.11.2022 23:55

или fig = px.line(df2[df2['date']>=pd.to_datetime('today').normalize()‌​-pd.Timedelta(30, unit='d')], x='date', y='uptime')

amance 07.11.2022 23:57

Извините, еще один вопрос, насколько легко преобразовать в % мудрое время безотказной работы? например, 7 дней % времени безотказной работы, 30 дней % времени безотказной работы и т. д.?

Hound 08.11.2022 05:21

Другие вопросы по теме