В файле CSV у меня есть даты, время простоя и номера инцидентов моего приложения. На основе приведенных ниже данных я должен построить график времени безотказной работы моего приложения с использованием Python. Время безотказной работы за последние 7 дней, время безотказной работы за последние 30 дней и время безотказной работы за последние 90 дней.
Я могу прочитать эти данные с помощью панд, и я могу построить время простоя по инциденту, используя метод ниже.
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")
Но я не могу рассчитать и построить время безотказной работы моего приложения. Любая помощь будет оценена
Это вызов. Я не могу представить, как представить эти данные на графике. Я пытался визуализировать с помощью линейного графика, но не мог нарисовать
Я бы использовал график штрих-кода. Вы можете инвертировать, взорвав время, а затем инвертировав.
Я предполагаю, что мой вопрос заключается в том, хотите ли вы заполнить все пропущенные даты в текущем кадре даты, поскольку я предполагаю, что ваше приложение работало и работало, как ожидалось, в эти даты.
Да, это правильно. Приложение было запущено и работало в пропущенные даты
# 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. Как я могу справиться с этим с помощью приведенного выше кода?
Один из способов сделать это — создать второй набор данных для отслеживания времени безотказной работы, дополняющий ваш текущий набор данных, который отслеживает время простоя.
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. Как я могу справиться с этим с помощью приведенного выше кода?
Хороший вопрос. Самый простой способ — приписать любое отрицательное значение нулю. Я обновил ответ, чтобы учесть эту возможность.
Благодаря тонну. Последний вопрос (извините, я новичок в пандах). Как я могу ограничить график только 30 днями? Другими словами, постройте график времени безотказной работы за последние 30 дней.
Без проблем. Вы могли бы сделать fig = px.line(df2[df2['date'].between(pd.to_datetime('today').normalize()-pd.Timedelta(30, unit='d'), pd.to_datetime('today').normalize())], x='date', y='uptime')
или fig = px.line(df2[df2['date']>=pd.to_datetime('today').normalize()-pd.Timedelta(30, unit='d')], x='date', y='uptime')
Извините, еще один вопрос, насколько легко преобразовать в % мудрое время безотказной работы? например, 7 дней % времени безотказной работы, 30 дней % времени безотказной работы и т. д.?
Как должен выглядеть график безотказной работы? Укажите ожидаемый результат на основе данных примера.