RathodHarish commited on
Commit
142c795
·
verified ·
1 Parent(s): 21fb82f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +88 -62
app.py CHANGED
@@ -47,34 +47,39 @@ def upload_csv(file):
47
  try:
48
  df['Timestamp'] = pd.to_datetime(df['Timestamp'], errors='coerce')
49
  debug_msg += f"Timestamps after conversion:\n{df['Timestamp'].to_string()}\n\n"
50
- if df['Timestamp'].isna().all():
51
- return ["All"], ["All"], ["All"], f"{debug_msg}Error: All Timestamp values are invalid or unparseable.", "All", "All", "All", None, None, None, None
 
52
  except Exception as e:
53
  return ["All"], ["All"], ["All"], f"{debug_msg}Error: Failed to parse Timestamp column: {str(e)}", "All", "All", "All", None, None, None, None
54
 
55
  # Extract unique values for dropdowns
56
  debug_msg += "Extracting unique values for dropdowns...\n"
57
- labs = ['All'] + sorted([str(lab) for lab in df['Lab'].fillna('Unknown').unique()])
58
- types = ['All'] + sorted([str(type_) for type_ in df['Type'].fillna('Unknown').unique()])
59
- debug_msg += f"Lab options: {labs}\nType options: {types}\n\n"
60
 
61
  # Extract date range for filter
62
- min_date = df['Timestamp'].min()
63
- max_date = df['Timestamp'].max()
64
- if pd.isna(min_date) or pd.isna(max_date):
65
  date_ranges = ['All']
66
- debug_msg += "Warning: Could not determine date range due to invalid timestamps.\n"
67
  else:
68
- min_date = min_date.strftime('%Y-%m-%d')
69
- max_date = max_date.strftime('%Y-%m-%d')
70
- date_ranges = ['All', f"{min_date} to {max_date}"]
71
- debug_msg += f"Date Range: {min_date} to {max_date}\n"
 
 
 
 
 
 
72
 
73
- # Automatically trigger filter_and_visualize after upload with default filters
74
  debug_msg += "Triggering initial visualization with default filters...\n"
75
  try:
76
- result = filter_and_visualize("All", "All", "All")
77
- device_cards, plot_daily, plot_uptime, anomaly_text, filter_msg = result
78
  debug_msg += f"Initial Filter Result: {filter_msg}\n"
79
  except Exception as e:
80
  debug_msg += f"Initial Filter Error: {str(e)}\n"
@@ -82,9 +87,9 @@ def upload_csv(file):
82
 
83
  return labs, types, date_ranges, debug_msg, "All", "All", "All", device_cards, plot_daily, plot_uptime, anomaly_text
84
  except Exception as e:
85
- return ["All"], ["All"], ["All"], f"{debug_msg}Failed to load CSV: {str(e)}", "All", "All", "All", None, None, None, None
86
 
87
- def filter_and_visualize(selected_lab, selected_type, selected_date_range):
88
  global df
89
  if df.empty:
90
  return None, None, None, None, "No data available."
@@ -97,38 +102,36 @@ def filter_and_visualize(selected_lab, selected_type, selected_date_range):
97
  error_msg += f"Initial DataFrame: {len(filtered_df)} rows\n"
98
 
99
  if selected_lab != "All":
100
- filtered_df = filtered_df[filtered_df["Lab"] == selected_lab]
101
  error_msg += f"After Lab filter ({selected_lab}): {len(filtered_df)} rows\n"
102
  if selected_type != "All":
103
  filtered_df = filtered_df[filtered_df["Type"] == selected_type]
104
  error_msg += f"After Type filter ({selected_type}): {len(filtered_df)} rows\n"
105
- if selected_date_range != "All" and selected_date_range != "No data available.":
106
  try:
107
  start_date, end_date = selected_date_range.split(" to ")
108
  start_date = pd.to_datetime(start_date)
109
  end_date = pd.to_datetime(end_date) + timedelta(days=1) # Include end date
110
- filtered_df = filtered_df[(filtered_df["Timestamp"] >= start_date) & (filtered_df["Timestamp"] < end_date)]
111
  error_msg += f"After Date Range filter ({start_date} to {end_date}): {len(filtered_df)} rows\n"
112
  except Exception as e:
113
  error_msg += f"Error parsing date range: {str(e)}\n"
114
- return None, None, None, None, error_msg
115
 
116
  if filtered_df.empty:
117
- return None, None, None, None, f"{error_msg}No data matches the selected filters."
118
 
119
  # Debug: Log the filtered DataFrame
120
- error_msg += f"Filtered DataFrame:\n{filtered_df.to_string()}\n"
121
 
122
  # Device Cards (as a table)
123
- device_cards = filtered_df[['DeviceID', 'Lab', 'Type', 'UsageCount', 'Timestamp']].sort_values(by='Timestamp', ascending=False)
124
 
125
- # Daily Log Trends (Line Chart)
126
  try:
127
- daily_logs = filtered_df.groupby(filtered_df['Timestamp'].dt.date).size()
128
- if daily_logs.empty:
129
- error_msg += "Warning: No data for Daily Log Trends (invalid timestamps).\n"
130
  plt.figure(figsize=(8, 4))
131
- plt.title("Daily Log Trends - No Data")
132
  plt.xlabel("Date")
133
  plt.ylabel("Number of Logs")
134
  buf1 = io.BytesIO()
@@ -136,16 +139,28 @@ def filter_and_visualize(selected_lab, selected_type, selected_date_range):
136
  plt.close()
137
  buf1.seek(0)
138
  else:
139
- plt.figure(figsize=(8, 4))
140
- daily_logs.plot(kind='line', marker='o', color='blue')
141
- plt.title("Daily Log Trends")
142
- plt.xlabel("Date")
143
- plt.ylabel("Number of Logs")
144
- plt.xticks(rotation=45)
145
- buf1 = io.BytesIO()
146
- plt.savefig(buf1, format="png", bbox_inches="tight")
147
- plt.close()
148
- buf1.seek(0)
 
 
 
 
 
 
 
 
 
 
 
 
149
  except Exception as e:
150
  error_msg += f"Error generating Daily Log Trends: {str(e)}\n"
151
  plt.figure(figsize=(8, 4))
@@ -159,13 +174,10 @@ def filter_and_visualize(selected_lab, selected_type, selected_date_range):
159
 
160
  # Weekly Uptime % (Bar Chart)
161
  try:
162
- end_date = filtered_df['Timestamp'].max()
163
- start_date = end_date - timedelta(days=7)
164
- weekly_df = filtered_df[(filtered_df['Timestamp'] >= start_date) & (filtered_df['Timestamp'] <= end_date)]
165
- if weekly_df.empty:
166
- error_msg += "Warning: No data for Weekly Uptime % (date range too narrow).\n"
167
  plt.figure(figsize=(8, 4))
168
- plt.title("Weekly Uptime % - No Data")
169
  plt.xlabel("Date")
170
  plt.ylabel("Uptime %")
171
  buf2 = io.BytesIO()
@@ -173,17 +185,31 @@ def filter_and_visualize(selected_lab, selected_type, selected_date_range):
173
  plt.close()
174
  buf2.seek(0)
175
  else:
176
- uptime = weekly_df.groupby(weekly_df['Timestamp'].dt.date)['Status'].apply(lambda x: (x == 'Up').mean() * 100)
177
- plt.figure(figsize=(8, 4))
178
- uptime.plot(kind='bar', color='green')
179
- plt.title("Weekly Uptime %")
180
- plt.xlabel("Date")
181
- plt.ylabel("Uptime %")
182
- plt.xticks(rotation=45)
183
- buf2 = io.BytesIO()
184
- plt.savefig(buf2, format="png", bbox_inches="tight")
185
- plt.close()
186
- buf2.seek(0)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
187
  except Exception as e:
188
  error_msg += f"Error generating Weekly Uptime %: {str(e)}\n"
189
  plt.figure(figsize=(8, 4))
@@ -206,7 +232,7 @@ def filter_and_visualize(selected_lab, selected_type, selected_date_range):
206
  error_msg += f"Error generating Anomaly Alerts: {str(e)}\n"
207
  anomaly_text = "Error generating anomaly alerts."
208
 
209
- return device_cards, buf1, buf2, anomaly_text, f"{error_msg}Filters applied successfully."
210
 
211
  def download_pdf(selected_lab, selected_type, selected_date_range):
212
  global df
@@ -218,7 +244,7 @@ def download_pdf(selected_lab, selected_type, selected_date_range):
218
  filtered_df = filtered_df[filtered_df["Lab"] == selected_lab]
219
  if selected_type != "All":
220
  filtered_df = filtered_df[filtered_df["Type"] == selected_type]
221
- if selected_date_range != "All" and selected_date_range != "No data available.":
222
  start_date, end_date = selected_date_range.split(" to ")
223
  start_date = pd.to_datetime(start_date)
224
  end_date = pd.to_datetime(end_date) + timedelta(days=1)
@@ -258,7 +284,7 @@ with gr.Blocks() as demo:
258
  submit_btn = gr.Button("Submit Filters")
259
 
260
  with gr.Row():
261
- device_table = gr.DataFrame(label="Device Cards (Usage, Last Log)")
262
  plot_daily = gr.Image(label="Daily Log Trends")
263
  plot_uptime = gr.Image(label="Weekly Uptime %")
264
 
@@ -273,13 +299,13 @@ with gr.Blocks() as demo:
273
  csv_input.change(
274
  fn=upload_csv,
275
  inputs=csv_input,
276
- outputs=[lab_dropdown, type_dropdown, date_dropdown, error_box, lab_dropdown, type_dropdown, date_dropdown, device_table, plot_daily, plot_uptime, anomaly_output]
277
  )
278
 
279
  submit_btn.click(
280
  fn=filter_and_visualize,
281
  inputs=[lab_dropdown, type_dropdown, date_dropdown],
282
- outputs=[device_table, plot_daily, plot_uptime, anomaly_output, error_box]
283
  )
284
 
285
  download_btn.click(
 
47
  try:
48
  df['Timestamp'] = pd.to_datetime(df['Timestamp'], errors='coerce')
49
  debug_msg += f"Timestamps after conversion:\n{df['Timestamp'].to_string()}\n\n"
50
+ timestamps_invalid = df['Timestamp'].isna().all()
51
+ if timestamps_invalid:
52
+ debug_msg += "Warning: All Timestamp values are invalid or unparseable. Date range filtering will be disabled.\n"
53
  except Exception as e:
54
  return ["All"], ["All"], ["All"], f"{debug_msg}Error: Failed to parse Timestamp column: {str(e)}", "All", "All", "All", None, None, None, None
55
 
56
  # Extract unique values for dropdowns
57
  debug_msg += "Extracting unique values for dropdowns...\n"
58
+ labs = ['All'] + sorted([str(lab) for lab in df['Lab'].dropna().unique()])
59
+ types = ['All'] + sorted([str(v) for v in df['Type'].dropna().unique()])
60
+ debug_msg += f"Lab options: {', '.join(labs)}\nType options: {', '.join(types)}\n\n"
61
 
62
  # Extract date range for filter
63
+ if timestamps_invalid:
 
 
64
  date_ranges = ['All']
65
+ debug_msg += "Date range dropdown disabled due to invalid timestamps.\n"
66
  else:
67
+ min_date = df['Timestamp'].min()
68
+ max_date = df['Timestamp'].max()
69
+ if pd.isna(min_date) or pd.isna(max_date):
70
+ date_ranges = ['All']
71
+ debug_msg += "Warning: Could not determine date range due to invalid timestamps.\n"
72
+ else:
73
+ min_date = min_date.strftime('%Y-%m-%d')
74
+ max_date = max_date.strftime('%Y-%m-%d')
75
+ date_ranges = ['All', f"{min_date_str} to {max_date_str}"]
76
+ debug_msg += f"Date Range: {min_date} to {max_date}\n"
77
 
78
+ # Automatically trigger filter_and_display after CSV upload with default filters
79
  debug_msg += "Triggering initial visualization with default filters...\n"
80
  try:
81
+ result = filter_and_display("All", "All", "All")
82
+ device_cards, plot_daily, plot_uptime_buf, anomaly_text, filter_msg = result
83
  debug_msg += f"Initial Filter Result: {filter_msg}\n"
84
  except Exception as e:
85
  debug_msg += f"Initial Filter Error: {str(e)}\n"
 
87
 
88
  return labs, types, date_ranges, debug_msg, "All", "All", "All", device_cards, plot_daily, plot_uptime, anomaly_text
89
  except Exception as e:
90
+ return ["All"], ["All"], ["All"], f"{debug_msg}Failed to process CSV: {str(e)}", "All", "All", "All", None, None, None, None"
91
 
92
+ def filter_and_display(selected_lab, selected_type, selected_date_range):
93
  global df
94
  if df.empty:
95
  return None, None, None, None, "No data available."
 
102
  error_msg += f"Initial DataFrame: {len(filtered_df)} rows\n"
103
 
104
  if selected_lab != "All":
105
+ filtered_df = filtered_df[filtered_df["Lab'] == "selected_lab"]
106
  error_msg += f"After Lab filter ({selected_lab}): {len(filtered_df)} rows\n"
107
  if selected_type != "All":
108
  filtered_df = filtered_df[filtered_df["Type"] == selected_type]
109
  error_msg += f"After Type filter ({selected_type}): {len(filtered_df)} rows\n"
110
+ if selected_date_range != "All" and selected_date_range != "No data available." and not df['Timestamp'].isna().all():
111
  try:
112
  start_date, end_date = selected_date_range.split(" to ")
113
  start_date = pd.to_datetime(start_date)
114
  end_date = pd.to_datetime(end_date) + timedelta(days=1) # Include end date
115
+ filtered_df = filtered_df[(filtered_df["Timestamp"] >= start_date) & (filtered_df['Timestamp'] < end_date)]
116
  error_msg += f"After Date Range filter ({start_date} to {end_date}): {len(filtered_df)} rows\n"
117
  except Exception as e:
118
  error_msg += f"Error parsing date range: {str(e)}\n"
 
119
 
120
  if filtered_df.empty:
121
+ return None, None, None, None, f"{error_msg}No data matches the selected filters.\n"
122
 
123
  # Debug: Log the filtered DataFrame
124
+ error_msg += f"Filtered DataFrame:\n{filtered_df.to_string()}\n\n"
125
 
126
  # Device Cards (as a table)
127
+ device_cards = filtered_df[['DeviceID', 'Lab', 'Type', 'UsageCount', 'Timestamp']].sort_values(by='Timestamp')
128
 
129
+ # Daily Log Trends
130
  try:
131
+ if df['Timestamp'].isna().all():
132
+ error_msg += "Warning: All timestamps are invalid. Skipping Daily Log Trends.\n"
 
133
  plt.figure(figsize=(8, 4))
134
+ plt.title("Daily Log Trends - No Data (Invalid Timestamps)")
135
  plt.xlabel("Date")
136
  plt.ylabel("Number of Logs")
137
  buf1 = io.BytesIO()
 
139
  plt.close()
140
  buf1.seek(0)
141
  else:
142
+ daily_logs = filtered_df.groupby(filtered_df['Timestamp'].dt.date).size()
143
+ if daily_logs.empty:
144
+ error_msg += "Warning: No data for Daily Log Trends.\n"
145
+ plt.figure(figsize=(8, 4))
146
+ plt.title("Daily Log Trends - No Data")
147
+ plt.xlabel("Date")
148
+ plt.ylabel("Number of Logs")
149
+ buf1 = io.BytesIO()
150
+ plt.savefig(buf1, format="png", bbox_inches="tight")
151
+ plt.close()
152
+ buf1.seek(0)
153
+ else:
154
+ plt.figure(figsize=(8, 4))
155
+ daily_logs.plot(kind='line', marker='o', color='blue')
156
+ plt.title("Daily Log Trends")
157
+ plt.xlabel("Date")
158
+ plt.ylabel("Number of Logs")
159
+ plt.xticks(rotation=45)
160
+ buf1 = io.BytesIO()
161
+ plt.savefig(buf1, format="png", bbox_inches="tight")
162
+ plt.close()
163
+ buf1.seek(0)
164
  except Exception as e:
165
  error_msg += f"Error generating Daily Log Trends: {str(e)}\n"
166
  plt.figure(figsize=(8, 4))
 
174
 
175
  # Weekly Uptime % (Bar Chart)
176
  try:
177
+ if df['Timestamp'].isna().all():
178
+ error_msg += "Warning: All timestamps are invalid. Skipping Weekly Uptime.\n"
 
 
 
179
  plt.figure(figsize=(8, 4))
180
+ plt.title("Weekly Uptime % - No Data (Invalid Timestamps)")
181
  plt.xlabel("Date")
182
  plt.ylabel("Uptime %")
183
  buf2 = io.BytesIO()
 
185
  plt.close()
186
  buf2.seek(0)
187
  else:
188
+ end_date = filtered_df['Timestamp'].max()
189
+ start_date = end_date - timedelta(days=7)
190
+ weekly_df = filtered_df[(filtered_df['Timestamp'] >= start_date) & (filtered_df['Timestamp'] <= end_date)]
191
+ if weekly_df.empty:
192
+ error_msg += "Warning: No data for Weekly Uptime % (date range too narrow).\n"
193
+ plt.figure(figsize=(8, 4))
194
+ plt.title("Weekly Uptime % - No Data")
195
+ plt.xlabel("Date")
196
+ plt.ylabel("Uptime %")
197
+ buf2 = io.BytesIO()
198
+ plt.savefig(buf2, format="png", bbox_inches="tight")
199
+ plt.close()
200
+ buf2.seek(0)
201
+ else:
202
+ uptime = weekly_df.groupby(weekly_df['Timestamp'].dt.date)['Status'].apply(lambda x: (x == 'Up').mean() * 100)
203
+ plt.figure(figsize=(8, 4))
204
+ uptime.plot(kind='bar', color='green')
205
+ plt.title("Weekly Uptime %")
206
+ plt.xlabel("Date")
207
+ plt.ylabel("Uptime %")
208
+ plt.xticks(rotation=45)
209
+ buf2 = io.BytesIO()
210
+ plt.savefig(buf2, format="png", bbox_inches="tight")
211
+ plt.close()
212
+ buf2.seek(0)
213
  except Exception as e:
214
  error_msg += f"Error generating Weekly Uptime %: {str(e)}\n"
215
  plt.figure(figsize=(8, 4))
 
232
  error_msg += f"Error generating Anomaly Alerts: {str(e)}\n"
233
  anomaly_text = "Error generating anomaly alerts."
234
 
235
+ return device_cards, buf1, buf2, anomaly_text, f"{error_msg}\nFilters applied successfully."
236
 
237
  def download_pdf(selected_lab, selected_type, selected_date_range):
238
  global df
 
244
  filtered_df = filtered_df[filtered_df["Lab"] == selected_lab]
245
  if selected_type != "All":
246
  filtered_df = filtered_df[filtered_df["Type"] == selected_type]
247
+ if selected_date_range != "All" and selected_date_range != "No data available." and not df['Timestamp'].isna().all():
248
  start_date, end_date = selected_date_range.split(" to ")
249
  start_date = pd.to_datetime(start_date)
250
  end_date = pd.to_datetime(end_date) + timedelta(days=1)
 
284
  submit_btn = gr.Button("Submit Filters")
285
 
286
  with gr.Row():
287
+ device_cards = gr.DataFrame(label="Device Cards (Usage, Last Log)")
288
  plot_daily = gr.Image(label="Daily Log Trends")
289
  plot_uptime = gr.Image(label="Weekly Uptime %")
290
 
 
299
  csv_input.change(
300
  fn=upload_csv,
301
  inputs=csv_input,
302
+ outputs=[lab_dropdown, type_dropdown, date_dropdown, error_box, lab_dropdown, type_dropdown, date_dropdown, device_cards, plot_daily, plot_uptime, anomaly_output],
303
  )
304
 
305
  submit_btn.click(
306
  fn=filter_and_visualize,
307
  inputs=[lab_dropdown, type_dropdown, date_dropdown],
308
+ outputs=[device_cards, plot_daily, plot_uptime, anomaly_output, error_box],
309
  )
310
 
311
  download_btn.click(