DHEIVER's picture
Update app.py
3a07b6e
import gradio as gr
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest
from datetime import datetime
def detect_anomalies(text, contamination=0.1):
lines = text.strip().split("\n")
data = []
for line in lines:
parts = line.strip().split(",")
if len(parts) == 2:
try:
date = datetime.strptime(parts[0], "%Y-%m-%d")
value = float(parts[1])
data.append((date, value))
except (ValueError, IndexError):
print(f"Ignorando linha inválida: {line}")
index = [item[0] for item in data]
values = [item[1] for item in data]
series = pd.Series(values, index=index)
data = pd.DataFrame({"Data": series.index, "Valor": series.values})
model = IsolationForest(contamination=contamination)
model.fit(data[["Valor"]])
anomalies = model.predict(data[["Valor"]])
anomaly_series = pd.Series(anomalies, index=data["Data"]).astype(bool)
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 8))
ax1.plot(series.index, series.values)
ax1.set_xlabel('Data')
ax1.set_ylabel('Valor')
ax1.set_title('Série Temporal de Entrada')
ax2.plot(anomaly_series.index, anomaly_series.values)
ax2.set_xlabel('Data')
ax2.set_ylabel('Anomalia')
ax2.set_title('Pontos de Anomalia')
plt.tight_layout()
plt.show()
return anomaly_series.to_json()
data_input = gr.inputs.Textbox(label="Série Temporal (data, valor)", lines=10)
contamination_input = gr.inputs.Slider(
minimum=0.01, maximum=0.5, step=0.01, default=0.1, label="Taxa de Contaminação"
)
label_output = gr.outputs.Textbox(label="Pontos de Anomalia (JSON)")
iface = gr.Interface(
fn=detect_anomalies,
inputs=[data_input, contamination_input],
outputs=label_output,
title="Detecção de Anomalias em Série Temporal",
description="Insira uma série temporal no formato 'data, valor' separados por linha e ajuste a taxa de contaminação para encontrar os pontos de anomalia.",
examples=[["2022-01-01, 10.2\n2022-01-02, 9.8\n2022-01-03, 9.5"]],
examples_per_page=1
)
iface.launch()