| 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() |
|
|