Implement drift monitoring configuration and update formatters to support drift workflows. Add drift function to orchestrator utilities and enhance tests for drift functionality.
2687 lines
104 KiB
Plaintext
2687 lines
104 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"id": "a287fa45",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Initializing Couchbase connection...\n",
|
|
"Awaiting Couchbase connection...\n",
|
|
"Couchbase connection ready\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"from orchestrator.activities.couchbase import Couchbase\n",
|
|
"from unittest.mock import MagicMock\n",
|
|
"logger = MagicMock(info=MagicMock(side_effect=print), debug=MagicMock(side_effect=print))\n",
|
|
"couchbase = Couchbase(\n",
|
|
" connection_string=\"couchbase://localhost\",\n",
|
|
" username=\"sientia\",\n",
|
|
" password=\"sientia\",\n",
|
|
" logger=logger,\n",
|
|
" notification_handler=MagicMock()\n",
|
|
")\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"id": "d9a0f9c4",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Executing couchbase query: %s \n",
|
|
"SELECT\n",
|
|
" pipelines.*,\n",
|
|
" models as model\n",
|
|
"FROM\n",
|
|
" `pipelines`\n",
|
|
"JOIN\n",
|
|
" `models` ON KEYS pipelines.model_id;\n",
|
|
"\n",
|
|
"Fetched %d rows from couchbase 1\n",
|
|
"Rows: \n",
|
|
" %s [\n",
|
|
" {\n",
|
|
" \"filters\": [\n",
|
|
" {\n",
|
|
" \"filter_name\": \"OUT_OF_BOUNDS_FILTER\",\n",
|
|
" \"policy\": \"DISCARD\"\n",
|
|
" },\n",
|
|
" {\n",
|
|
" \"filter_name\": \"NULL_VALUES_FILTER\",\n",
|
|
" \"policy\": \"DISCARD\"\n",
|
|
" }\n",
|
|
" ],\n",
|
|
" \"frequency\": \"5s\",\n",
|
|
" \"max_retry_policy\": 1,\n",
|
|
" \"model\": {\n",
|
|
" \"name\": \"Demo Model-Demo2\"\n",
|
|
" },\n",
|
|
" \"model_id\": \"1\",\n",
|
|
" \"name\": \"scouter-opcua-pipeline\",\n",
|
|
" \"read_tags\": [\n",
|
|
" {\n",
|
|
" \"aggr_func\": \"avg\",\n",
|
|
" \"data_range\": [\n",
|
|
" -100,\n",
|
|
" 100\n",
|
|
" ],\n",
|
|
" \"tag_name\": \"Counter\"\n",
|
|
" }\n",
|
|
" ],\n",
|
|
" \"tag_retention_minutes\": 60,\n",
|
|
" \"workflow_type\": \"scouter\"\n",
|
|
" }\n",
|
|
"]\n",
|
|
"[{'filters': [{'filter_name': 'OUT_OF_BOUNDS_FILTER', 'policy': 'DISCARD'}, {'filter_name': 'NULL_VALUES_FILTER', 'policy': 'DISCARD'}], 'frequency': '5s', 'max_retry_policy': 1, 'model': {'name': 'Demo Model-Demo2'}, 'model_id': '1', 'name': 'scouter-opcua-pipeline', 'read_tags': [{'aggr_func': 'avg', 'data_range': [-100, 100], 'tag_name': 'Counter'}], 'tag_retention_minutes': 60, 'workflow_type': 'scouter'}]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"query = \"\"\"\n",
|
|
"SELECT\n",
|
|
" pipelines.*,\n",
|
|
" models as model\n",
|
|
"FROM\n",
|
|
" `pipelines`\n",
|
|
"JOIN\n",
|
|
" `models` ON KEYS pipelines.model_id;\n",
|
|
"\"\"\"\n",
|
|
"if __name__ == \"__main__\":\n",
|
|
"\n",
|
|
"\n",
|
|
" result = await couchbase.load_query_from_couchbase({\n",
|
|
" \"query\": query\n",
|
|
" })\n",
|
|
"\n",
|
|
" print(result)\n",
|
|
" "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"id": "7d01f160",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"from temporalio import client\n",
|
|
"from orchestrator.activities.temporal_manager import TemporalManager\n",
|
|
"import os\n",
|
|
"from unittest.mock import MagicMock\n",
|
|
"\n",
|
|
"host = \"localhost:7233\"\n",
|
|
"logger = MagicMock(info=MagicMock(side_effect=print), debug=MagicMock(side_effect=print))\n",
|
|
"\n",
|
|
"temporal_client = await client.Client.connect(\n",
|
|
" target_host=host,\n",
|
|
" namespace=os.getenv('TEMPORAL_NAMESPACE', 'default')\n",
|
|
")\n",
|
|
"\n",
|
|
" "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "bb750ae6",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"<temporalio.client.ScheduleHandle at 0x7700871c6150>"
|
|
]
|
|
},
|
|
"execution_count": 4,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"import asyncio\n",
|
|
"from datetime import timedelta\n",
|
|
"from temporalio.client import (\n",
|
|
" Client,\n",
|
|
" Schedule,\n",
|
|
" ScheduleActionStartWorkflow,\n",
|
|
" ScheduleIntervalSpec,\n",
|
|
" ScheduleSpec,\n",
|
|
")\n",
|
|
"from temporalio.common import TypedSearchAttributes, SearchAttributeKey, SearchAttributePair\n",
|
|
"\n",
|
|
"# temporal operator search-attribute create --namespace scouter --name model_id --type Text && temporal operator search-attribute create --namespace scouter --name orchestrated --type Text && temporal operator search-attribute create --namespace scouter --name model_name --type Text && temporal operator search-attribute create --namespace laborious --name model_id --type Text && temporal operator search-attribute create --namespace laborious --name orchestrated --type Text && temporal operator search-attribute create --namespace laborious --name model_name --type Text\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"await temporal_client.create_schedule(\n",
|
|
" \"orchestrator\",\n",
|
|
" Schedule(\n",
|
|
" action=ScheduleActionStartWorkflow(\n",
|
|
" 'orchestrator',\n",
|
|
" {\n",
|
|
" \"schedule_name\": \"orchestrator-test\",\n",
|
|
" \"pipelines_query\": {\n",
|
|
" \"collection\": \"pipelines\",\n",
|
|
" \"aggregation\": [\n",
|
|
" {\n",
|
|
" \"$lookup\": {\n",
|
|
" \"from\": \"models\",\n",
|
|
" \"localField\": \"model_id\",\n",
|
|
" \"foreignField\": \"id\",\n",
|
|
" \"as\": \"model_docs\"\n",
|
|
" }\n",
|
|
" },\n",
|
|
" {\n",
|
|
" \"$match\": {\n",
|
|
" \"active\": True\n",
|
|
" }\n",
|
|
" },\n",
|
|
" {\n",
|
|
" \"$addFields\": {\n",
|
|
" \"models\": {\n",
|
|
" \"$arrayElemAt\": [\n",
|
|
" \"$model_docs\",\n",
|
|
" 0\n",
|
|
" ]\n",
|
|
" }\n",
|
|
" }\n",
|
|
" },\n",
|
|
" {\n",
|
|
" \"$match\": {\n",
|
|
" \"models.active\": True\n",
|
|
" }\n",
|
|
" },\n",
|
|
" {\n",
|
|
" \"$project\": {\n",
|
|
" \"model_docs\": 0\n",
|
|
" }\n",
|
|
" }\n",
|
|
" ]\n",
|
|
" },\n",
|
|
" \"opc_servers_query\": {\n",
|
|
" \"collection\": \"opc-servers\",\n",
|
|
" \"filters\": {\n",
|
|
"\n",
|
|
" }\n",
|
|
" }\n",
|
|
" },\n",
|
|
" id=\"orchestrator\",\n",
|
|
" task_queue=\"orchestrator-queue\",\n",
|
|
" execution_timeout=timedelta(minutes=600)\n",
|
|
" ),\n",
|
|
" spec=ScheduleSpec(\n",
|
|
" intervals=[ScheduleIntervalSpec(every=timedelta(minutes=60))]\n",
|
|
" )\n",
|
|
" )\n",
|
|
")\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "b840347d",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Error deleting schedule scouter-load-test-1: workflow execution already completed\n",
|
|
"Error deleting schedule scouter-load-test-2: workflow execution already completed\n",
|
|
"Error deleting schedule scouter-load-test-3: workflow execution already completed\n",
|
|
"Error deleting schedule scouter-load-test-4: workflow execution already completed\n",
|
|
"Error deleting schedule scouter-load-test-5: workflow execution already completed\n",
|
|
"Error deleting schedule scouter-load-test-6: workflow execution already completed\n",
|
|
"Error deleting schedule scouter-load-test-7: workflow execution already completed\n",
|
|
"Error deleting schedule scouter-load-test-8: workflow execution already completed\n",
|
|
"Error deleting schedule scouter-load-test-9: workflow execution already completed\n",
|
|
"Error deleting schedule scouter-load-test-10: workflow execution already completed\n",
|
|
"Error deleting schedule scouter-load-test-11: workflow execution already completed\n",
|
|
"Error deleting schedule scouter-load-test-12: workflow execution already completed\n",
|
|
"Error deleting schedule scouter-load-test-13: workflow execution already completed\n",
|
|
"Error deleting schedule scouter-load-test-14: workflow execution already completed\n",
|
|
"Error deleting schedule scouter-load-test-15: workflow execution already completed\n",
|
|
"Error deleting schedule scouter-load-test-16: workflow execution already completed\n",
|
|
"Error deleting schedule scouter-load-test-17: workflow execution already completed\n",
|
|
"Error deleting schedule scouter-load-test-18: workflow execution already completed\n",
|
|
"Error deleting schedule scouter-load-test-19: workflow execution already completed\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# Delete schedule by ID\n",
|
|
"schedule_id = \"scouter-load-test-num\"\n",
|
|
"\n",
|
|
"for i in range(0, 70):\n",
|
|
"\n",
|
|
" try:\n",
|
|
" handle = temporal_client.get_schedule_handle(\n",
|
|
" schedule_id.replace(\"num\", str(i)))\n",
|
|
" \n",
|
|
" await handle.delete()\n",
|
|
" except Exception as e:\n",
|
|
" print(f\"Error deleting schedule {schedule_id.replace('num', str(i))}: {e}\")\n",
|
|
"\n",
|
|
"# Delete schedule by ID\n",
|
|
"schedule_id = \"laborious-load-test-num\"\n",
|
|
"\n",
|
|
"for i in range(0, 70):\n",
|
|
"\n",
|
|
" try:\n",
|
|
" handle = temporal_client.get_schedule_handle(\n",
|
|
" schedule_id.replace(\"num\", str(i)))\n",
|
|
" \n",
|
|
" await handle.delete()\n",
|
|
" except Exception as e:\n",
|
|
" print(f\"Error deleting schedule {schedule_id.replace('num', str(i))}: {e}\")\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"id": "374b5b0e",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"scouter-load-test-num\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"schedule_id = \"scouter-load-test-num\"\n",
|
|
"schedule_id.replace(\"-\", \"_\")\n",
|
|
"\n",
|
|
"print(schedule_id)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"id": "1bd82225",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Getting orchestrated schedules...\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"schedules = await manager.load_schedule()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 24,
|
|
"id": "1948670e",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"from google.protobuf.json_format import MessageToDict\n",
|
|
"import base64\n",
|
|
"import json\n",
|
|
"for arg in schedules.schedule.action.args:\n",
|
|
" data = MessageToDict(arg)\n",
|
|
" data = base64.b64decode(data['data']).decode('utf-8')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"id": "a4c777dd",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"from google.protobuf.json_format import MessageToDict\n",
|
|
"import base64\n",
|
|
"import json\n",
|
|
"\n",
|
|
"schedules_config = {}\n",
|
|
"async for schedule in await temporal_client.list_schedules():\n",
|
|
" id = schedule.id\n",
|
|
"\n",
|
|
" handle = temporal_client.get_schedule_handle(id)\n",
|
|
"\n",
|
|
" desc = await handle.describe()\n",
|
|
"\n",
|
|
" for arg in desc.schedule.action.args:\n",
|
|
" data = MessageToDict(arg)['data']\n",
|
|
" data = base64.b64decode(data).decode('utf-8')\n",
|
|
"\n",
|
|
" frequency = desc.schedule.spec.intervals[0].every.seconds\n",
|
|
"\n",
|
|
" schedules_config[id] = {\n",
|
|
" 'frequency': frequency,\n",
|
|
" 'data': json.loads(data),\n",
|
|
" 'handle': handle\n",
|
|
" }\n",
|
|
" \n",
|
|
" \n",
|
|
" \n",
|
|
" "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"id": "f81b3728",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"{'id': 'orchestrator', 'schedule': ScheduleListSchedule(action=ScheduleListActionStartWorkflow(workflow='orchestrator'), spec=ScheduleSpec(calendars=[], intervals=[ScheduleIntervalSpec(every=datetime.timedelta(seconds=3600), offset=None)], cron_expressions=[], skip=[], start_at=None, end_at=None, jitter=None, time_zone_name=None), state=ScheduleListState(note=None, paused=False)), 'info': ScheduleListInfo(recent_actions=[ScheduleActionResult(scheduled_at=datetime.datetime(2025, 7, 14, 9, 0, tzinfo=datetime.timezone.utc), started_at=datetime.datetime(2025, 7, 14, 9, 0, 0, 165083, tzinfo=datetime.timezone.utc), action=ScheduleActionExecutionStartWorkflow(workflow_id='orchestrator-2025-07-14T09:00:00Z', first_execution_run_id='01980829-9700-771a-9c9d-2450eecc9af4')), ScheduleActionResult(scheduled_at=datetime.datetime(2025, 7, 14, 10, 0, tzinfo=datetime.timezone.utc), started_at=datetime.datetime(2025, 7, 14, 10, 0, 0, 125309, tzinfo=datetime.timezone.utc), action=ScheduleActionExecutionStartWorkflow(workflow_id='orchestrator-2025-07-14T10:00:00Z', first_execution_run_id='01980860-8578-759d-97fa-dbdfc784f88a')), ScheduleActionResult(scheduled_at=datetime.datetime(2025, 7, 14, 11, 0, tzinfo=datetime.timezone.utc), started_at=datetime.datetime(2025, 7, 14, 11, 0, 0, 124356, tzinfo=datetime.timezone.utc), action=ScheduleActionExecutionStartWorkflow(workflow_id='orchestrator-2025-07-14T11:00:00Z', first_execution_run_id='01980897-73f7-7e83-a7a6-20eaac38e7d4')), ScheduleActionResult(scheduled_at=datetime.datetime(2025, 7, 14, 12, 0, tzinfo=datetime.timezone.utc), started_at=datetime.datetime(2025, 7, 14, 12, 0, 0, 167329, tzinfo=datetime.timezone.utc), action=ScheduleActionExecutionStartWorkflow(workflow_id='orchestrator-2025-07-14T12:00:00Z', first_execution_run_id='019808ce-62a2-75d6-b11d-c5387cfa258f')), ScheduleActionResult(scheduled_at=datetime.datetime(2025, 7, 14, 13, 0, tzinfo=datetime.timezone.utc), started_at=datetime.datetime(2025, 7, 14, 13, 0, 0, 167575, tzinfo=datetime.timezone.utc), action=ScheduleActionExecutionStartWorkflow(workflow_id='orchestrator-2025-07-14T13:00:00Z', first_execution_run_id='01980905-5122-7807-90ae-3782d0332e79'))], next_action_times=[datetime.datetime(2025, 7, 14, 14, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 7, 14, 15, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 7, 14, 16, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 7, 14, 17, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2025, 7, 14, 18, 0, tzinfo=datetime.timezone.utc)]), 'typed_search_attributes': TypedSearchAttributes(search_attributes=[]), 'search_attributes': {}, 'data_converter': DataConverter(payload_converter_class=<class 'temporalio.converter.DefaultPayloadConverter'>, payload_codec=None, failure_converter_class=<class 'temporalio.converter.DefaultFailureConverter'>, payload_converter=<temporalio.converter.DefaultPayloadConverter object at 0x787d51390750>, failure_converter=<temporalio.converter.DefaultFailureConverter object at 0x787d5277b590>), 'raw_entry': schedule_id: \"orchestrator\"\n",
|
|
"info {\n",
|
|
" spec {\n",
|
|
" interval {\n",
|
|
" interval {\n",
|
|
" seconds: 3600\n",
|
|
" }\n",
|
|
" }\n",
|
|
" }\n",
|
|
" workflow_type {\n",
|
|
" name: \"orchestrator\"\n",
|
|
" }\n",
|
|
" recent_actions {\n",
|
|
" schedule_time {\n",
|
|
" seconds: 1752483600\n",
|
|
" }\n",
|
|
" actual_time {\n",
|
|
" seconds: 1752483600\n",
|
|
" nanos: 165083498\n",
|
|
" }\n",
|
|
" start_workflow_result {\n",
|
|
" workflow_id: \"orchestrator-2025-07-14T09:00:00Z\"\n",
|
|
" run_id: \"01980829-9700-771a-9c9d-2450eecc9af4\"\n",
|
|
" }\n",
|
|
" start_workflow_status: WORKFLOW_EXECUTION_STATUS_COMPLETED\n",
|
|
" }\n",
|
|
" recent_actions {\n",
|
|
" schedule_time {\n",
|
|
" seconds: 1752487200\n",
|
|
" }\n",
|
|
" actual_time {\n",
|
|
" seconds: 1752487200\n",
|
|
" nanos: 125309119\n",
|
|
" }\n",
|
|
" start_workflow_result {\n",
|
|
" workflow_id: \"orchestrator-2025-07-14T10:00:00Z\"\n",
|
|
" run_id: \"01980860-8578-759d-97fa-dbdfc784f88a\"\n",
|
|
" }\n",
|
|
" start_workflow_status: WORKFLOW_EXECUTION_STATUS_COMPLETED\n",
|
|
" }\n",
|
|
" recent_actions {\n",
|
|
" schedule_time {\n",
|
|
" seconds: 1752490800\n",
|
|
" }\n",
|
|
" actual_time {\n",
|
|
" seconds: 1752490800\n",
|
|
" nanos: 124356906\n",
|
|
" }\n",
|
|
" start_workflow_result {\n",
|
|
" workflow_id: \"orchestrator-2025-07-14T11:00:00Z\"\n",
|
|
" run_id: \"01980897-73f7-7e83-a7a6-20eaac38e7d4\"\n",
|
|
" }\n",
|
|
" start_workflow_status: WORKFLOW_EXECUTION_STATUS_COMPLETED\n",
|
|
" }\n",
|
|
" recent_actions {\n",
|
|
" schedule_time {\n",
|
|
" seconds: 1752494400\n",
|
|
" }\n",
|
|
" actual_time {\n",
|
|
" seconds: 1752494400\n",
|
|
" nanos: 167329351\n",
|
|
" }\n",
|
|
" start_workflow_result {\n",
|
|
" workflow_id: \"orchestrator-2025-07-14T12:00:00Z\"\n",
|
|
" run_id: \"019808ce-62a2-75d6-b11d-c5387cfa258f\"\n",
|
|
" }\n",
|
|
" start_workflow_status: WORKFLOW_EXECUTION_STATUS_COMPLETED\n",
|
|
" }\n",
|
|
" recent_actions {\n",
|
|
" schedule_time {\n",
|
|
" seconds: 1752498000\n",
|
|
" }\n",
|
|
" actual_time {\n",
|
|
" seconds: 1752498000\n",
|
|
" nanos: 167575982\n",
|
|
" }\n",
|
|
" start_workflow_result {\n",
|
|
" workflow_id: \"orchestrator-2025-07-14T13:00:00Z\"\n",
|
|
" run_id: \"01980905-5122-7807-90ae-3782d0332e79\"\n",
|
|
" }\n",
|
|
" start_workflow_status: WORKFLOW_EXECUTION_STATUS_RUNNING\n",
|
|
" }\n",
|
|
" future_action_times {\n",
|
|
" seconds: 1752501600\n",
|
|
" }\n",
|
|
" future_action_times {\n",
|
|
" seconds: 1752505200\n",
|
|
" }\n",
|
|
" future_action_times {\n",
|
|
" seconds: 1752508800\n",
|
|
" }\n",
|
|
" future_action_times {\n",
|
|
" seconds: 1752512400\n",
|
|
" }\n",
|
|
" future_action_times {\n",
|
|
" seconds: 1752516000\n",
|
|
" }\n",
|
|
"}\n",
|
|
"}\n",
|
|
"{'_client': <temporalio.client.Client object at 0x787d53dd3490>, 'id': 'orchestrator'}\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"async for schedule in await temporal_client.list_schedules():\n",
|
|
" print(vars(schedule))\n",
|
|
" id = schedule.id\n",
|
|
"\n",
|
|
" handle = temporal_client.get_schedule_handle(id)\n",
|
|
"\n",
|
|
" print(vars(handle))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 13,
|
|
"id": "988d1718",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"schedules_config = {\n",
|
|
" \"scouter-opcua-orchestrated-pipeline\": schedules_config['scouter-opcua-orchestrated-pipeline'],\n",
|
|
"}"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 14,
|
|
"id": "c12f5e75",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"scouter-opcua-orchestrated-pipeline {'frequency': 5, 'data': {'filters': {'NULL_VALUES_FILTER': {'policy': 'DISCARD'}, 'OUT_OF_BOUNDS_FILTER': {'policy': 'DISCARD'}}, 'frequency': '5s', 'max_retry_policy': 1, 'model_id': '1', 'model_name': 'Demo Model-Demo2', 'model_tags': {'Counter': {'aggr_func': 'avg', 'data_range': [-100, 100]}}, 'retention_time': 3600, 'schedule_name': 'scouter-opcua-orchestrated-pipeline', 'schema': 'sientia_data', 'table_name': 'laborious_data', 'topic': 'raw_scouter-opcua-orchestrated-pipeline', 'trigger_laborious': False, 'workflow_type': 'scouter'}, 'handle': <temporalio.client.ScheduleHandle object at 0x7dfab3b2ab50>}\n",
|
|
"scouter-opcua-orchestrated-pipeline\n",
|
|
"{'workflow': 'scouter', 'args': [metadata {\n",
|
|
" key: \"encoding\"\n",
|
|
" value: \"json/plain\"\n",
|
|
"}\n",
|
|
"data: \"{\\\"filters\\\":{\\\"NULL_VALUES_FILTER\\\":{\\\"policy\\\":\\\"DISCARD\\\"},\\\"OUT_OF_BOUNDS_FILTER\\\":{\\\"policy\\\":\\\"DISCARD\\\"}},\\\"frequency\\\":\\\"5s\\\",\\\"max_retry_policy\\\":1,\\\"model_id\\\":\\\"1\\\",\\\"model_name\\\":\\\"Demo Model-Demo2\\\",\\\"model_tags\\\":{\\\"Counter\\\":{\\\"aggr_func\\\":\\\"avg\\\",\\\"data_range\\\":[-100,100]}},\\\"retention_time\\\":3600,\\\"schedule_name\\\":\\\"scouter-opcua-orchestrated-pipeline\\\",\\\"schema\\\":\\\"sientia_data\\\",\\\"table_name\\\":\\\"laborious_data\\\",\\\"topic\\\":\\\"raw_scouter-opcua-orchestrated-pipeline\\\",\\\"trigger_laborious\\\":false,\\\"workflow_type\\\":\\\"scouter\\\"}\"\n",
|
|
"], 'id': 'scouter-opcua-orchestrated-pipeline', 'task_queue': 'scouter-queue', 'execution_timeout': datetime.timedelta(seconds=120), 'run_timeout': None, 'task_timeout': None, 'retry_policy': None, 'memo': None, 'typed_search_attributes': TypedSearchAttributes(search_attributes=[]), 'headers': None, 'untyped_search_attributes': {}, 'static_summary': None, 'static_details': None, 'priority': Priority(priority_key=None)}\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"from temporalio.client import Client, ScheduleUpdateInput, ScheduleUpdate, ScheduleSpec\n",
|
|
"\n",
|
|
"\n",
|
|
"for id, schedule in schedules_config.items():\n",
|
|
" print(id, schedule)\n",
|
|
" \n",
|
|
" if schedule['frequency'] != 600:\n",
|
|
" print(id)\n",
|
|
"\n",
|
|
" handle = schedule['handle']\n",
|
|
" \n",
|
|
" async def update_schedule(input: ScheduleUpdateInput) -> ScheduleUpdate:\n",
|
|
" schedule_action = input.description.schedule.action\n",
|
|
"\n",
|
|
" print(schedule_action.__dict__)\n",
|
|
" \n",
|
|
" if hasattr(schedule_action, 'args'):\n",
|
|
" schedule_action.args = [{}]\n",
|
|
" \n",
|
|
" # Atualiza o intervalo de execução\n",
|
|
" input.description.schedule.spec.intervals = [\n",
|
|
" ScheduleIntervalSpec(every=timedelta(minutes=10))\n",
|
|
" ]\n",
|
|
" \n",
|
|
" return ScheduleUpdate(schedule=input.description.schedule)\n",
|
|
"\n",
|
|
" await handle.update(update_schedule)\n",
|
|
" \n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"id": "87eb10c8",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"from redis import Redis\n",
|
|
"\n",
|
|
"redis = Redis(host='localhost', port=6379)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"id": "fe4ad9dc",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Chave: slot:opc_tags:2, Valor: {\n",
|
|
"\"slot2\": \"value\"\n",
|
|
"}\n",
|
|
"Chave: slot:opc_tags:1, Valor: {\n",
|
|
"\"slot1\": \"value\"\n",
|
|
"}\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"matching_keys = redis.keys(\"slot:opc_tags:*\")\n",
|
|
"\n",
|
|
"if matching_keys:\n",
|
|
" decoded_keys = [key.decode('utf-8') for key in matching_keys]\n",
|
|
" values = redis.mget(decoded_keys)\n",
|
|
"\n",
|
|
" items = {}\n",
|
|
" for i, key in enumerate(decoded_keys):\n",
|
|
" value = values[i]\n",
|
|
" if value is not None:\n",
|
|
" try:\n",
|
|
" items[key] = value.decode('utf-8')\n",
|
|
" except (UnicodeDecodeError, AttributeError):\n",
|
|
" items[key] = value\n",
|
|
" else:\n",
|
|
" items[key] = None\n",
|
|
"\n",
|
|
" for key, value in items.items():\n",
|
|
" print(f\"Chave: {key}, Valor: {value}\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "e8025cbb",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Model Monitoring"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"id": "87a9dc89",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"from sientia.ModelAnalysis import ModelAnalysis\n",
|
|
"\n",
|
|
"config = {\n",
|
|
" \"target\": \"Square\",\n",
|
|
" \"prediction\": \"prediction\",\n",
|
|
" \"timestamp\": \"timestamp\",\n",
|
|
" \"features\": [\"Counter\", \"Rollout\"]\n",
|
|
"}\n",
|
|
"\n",
|
|
"model = ModelAnalysis(config=config)\n",
|
|
"\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"id": "2a74ad2f",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"from sientia_do.temporal.activities.postgres import Postgres\n",
|
|
"from unittest.mock import AsyncMock\n",
|
|
"from pandas import DataFrame\n",
|
|
"\n",
|
|
"postgres = Postgres(\n",
|
|
" host=\"localhost\",\n",
|
|
" port=5432,\n",
|
|
" dbname=\"sientia\",\n",
|
|
" user=\"sientia\",\n",
|
|
" password=\"sientia\",\n",
|
|
" min_connections=1,\n",
|
|
" max_connections=10,\n",
|
|
" logger=AsyncMock(),\n",
|
|
" notification_handler=AsyncMock(),\n",
|
|
" metrics_controller=AsyncMock()\n",
|
|
")\n",
|
|
"\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "938cecbd",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"/home/grezewave/Documents/projects/sientia/sientia-dataops-orchestrator_temporal/venv/lib/python3.11/site-packages/sientia_do/observability/sientia_monitoring.py:83: RuntimeWarning: coroutine 'AsyncMockMixin._execute_mock_call' was never awaited\n",
|
|
" self.logger.custom_info(message, metadata)\n",
|
|
"/home/grezewave/Documents/projects/sientia/sientia-dataops-orchestrator_temporal/venv/lib/python3.11/site-packages/sientia_do/observability/sientia_monitoring.py:59: RuntimeWarning: coroutine 'AsyncMockMixin._execute_mock_call' was never awaited\n",
|
|
" self.metrics_controller.start()\n",
|
|
"/home/grezewave/Documents/projects/sientia/sientia-dataops-orchestrator_temporal/venv/lib/python3.11/site-packages/sientia_do/observability/sientia_monitoring.py:83: RuntimeWarning: coroutine 'AsyncMockMixin._execute_mock_call' was never awaited\n",
|
|
" self.logger.custom_info(message, metadata)\n",
|
|
"/home/grezewave/Documents/projects/sientia/sientia-dataops-orchestrator_temporal/venv/lib/python3.11/site-packages/sientia_do/observability/sientia_monitoring.py:95: RuntimeWarning: coroutine 'AsyncMockMixin._execute_mock_call' was never awaited\n",
|
|
" self.logger.custom_debug(message, metadata)\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>variable</th>\n",
|
|
" <th>value</th>\n",
|
|
" <th>prediction</th>\n",
|
|
" <th>timestamp</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>Square</td>\n",
|
|
" <td>42.2950</td>\n",
|
|
" <td>-3.018465</td>\n",
|
|
" <td>2025-11-12 12:44:50+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>1.8610</td>\n",
|
|
" <td>-3.018465</td>\n",
|
|
" <td>2025-11-12 12:44:50+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>-45.0980</td>\n",
|
|
" <td>-3.018465</td>\n",
|
|
" <td>2025-11-12 12:44:50+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>0.3970</td>\n",
|
|
" <td>2.341423</td>\n",
|
|
" <td>2025-11-12 12:44:20+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>-40.0260</td>\n",
|
|
" <td>2.341423</td>\n",
|
|
" <td>2025-11-12 12:44:20+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>5</th>\n",
|
|
" <td>Square</td>\n",
|
|
" <td>43.3190</td>\n",
|
|
" <td>2.341423</td>\n",
|
|
" <td>2025-11-12 12:44:20+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>6</th>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>-0.2645</td>\n",
|
|
" <td>4.696591</td>\n",
|
|
" <td>2025-11-12 12:42:15+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>7</th>\n",
|
|
" <td>Square</td>\n",
|
|
" <td>42.1850</td>\n",
|
|
" <td>4.696591</td>\n",
|
|
" <td>2025-11-12 12:42:15+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>8</th>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>-37.8385</td>\n",
|
|
" <td>4.696591</td>\n",
|
|
" <td>2025-11-12 12:42:15+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>9</th>\n",
|
|
" <td>Square</td>\n",
|
|
" <td>2.8880</td>\n",
|
|
" <td>-70.845157</td>\n",
|
|
" <td>2025-11-11 23:00:48+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>10</th>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>18.7945</td>\n",
|
|
" <td>-70.845157</td>\n",
|
|
" <td>2025-11-11 23:00:48+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>11</th>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>-12.6565</td>\n",
|
|
" <td>-70.845157</td>\n",
|
|
" <td>2025-11-11 23:00:48+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>12</th>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>17.7415</td>\n",
|
|
" <td>-71.894590</td>\n",
|
|
" <td>2025-11-11 23:00:18+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>13</th>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>-11.1570</td>\n",
|
|
" <td>-71.894590</td>\n",
|
|
" <td>2025-11-11 23:00:18+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>14</th>\n",
|
|
" <td>Square</td>\n",
|
|
" <td>2.1610</td>\n",
|
|
" <td>-71.894590</td>\n",
|
|
" <td>2025-11-11 23:00:18+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>15</th>\n",
|
|
" <td>Square</td>\n",
|
|
" <td>-2.0490</td>\n",
|
|
" <td>-67.033953</td>\n",
|
|
" <td>2025-11-11 22:59:48+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>16</th>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>16.5365</td>\n",
|
|
" <td>-67.033953</td>\n",
|
|
" <td>2025-11-11 22:59:48+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>17</th>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>-15.2205</td>\n",
|
|
" <td>-67.033953</td>\n",
|
|
" <td>2025-11-11 22:59:48+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>18</th>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>-11.7930</td>\n",
|
|
" <td>-70.514462</td>\n",
|
|
" <td>2025-11-11 22:59:18+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>19</th>\n",
|
|
" <td>Square</td>\n",
|
|
" <td>-4.3350</td>\n",
|
|
" <td>-70.514462</td>\n",
|
|
" <td>2025-11-11 22:59:18+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>20</th>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>16.3065</td>\n",
|
|
" <td>-70.514462</td>\n",
|
|
" <td>2025-11-11 22:59:18+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>21</th>\n",
|
|
" <td>Square</td>\n",
|
|
" <td>0.6840</td>\n",
|
|
" <td>-72.523279</td>\n",
|
|
" <td>2025-11-11 22:58:48+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>22</th>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>-9.2570</td>\n",
|
|
" <td>-72.523279</td>\n",
|
|
" <td>2025-11-11 22:58:48+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>23</th>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>14.9965</td>\n",
|
|
" <td>-72.523279</td>\n",
|
|
" <td>2025-11-11 22:58:48+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>24</th>\n",
|
|
" <td>Square</td>\n",
|
|
" <td>1.1700</td>\n",
|
|
" <td>-72.831684</td>\n",
|
|
" <td>2025-11-11 22:58:18+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>25</th>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>-7.0635</td>\n",
|
|
" <td>-72.831684</td>\n",
|
|
" <td>2025-11-11 22:58:18+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>26</th>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>10.9875</td>\n",
|
|
" <td>-72.831684</td>\n",
|
|
" <td>2025-11-11 22:58:18+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>27</th>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>-2.0110</td>\n",
|
|
" <td>-77.865944</td>\n",
|
|
" <td>2025-11-11 22:57:48+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>28</th>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>10.4545</td>\n",
|
|
" <td>-77.865944</td>\n",
|
|
" <td>2025-11-11 22:57:48+00:00</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>29</th>\n",
|
|
" <td>Square</td>\n",
|
|
" <td>-0.2070</td>\n",
|
|
" <td>-77.865944</td>\n",
|
|
" <td>2025-11-11 22:57:48+00:00</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" variable value prediction timestamp\n",
|
|
"0 Square 42.2950 -3.018465 2025-11-12 12:44:50+00:00\n",
|
|
"1 Rollout 1.8610 -3.018465 2025-11-12 12:44:50+00:00\n",
|
|
"2 Counter -45.0980 -3.018465 2025-11-12 12:44:50+00:00\n",
|
|
"3 Rollout 0.3970 2.341423 2025-11-12 12:44:20+00:00\n",
|
|
"4 Counter -40.0260 2.341423 2025-11-12 12:44:20+00:00\n",
|
|
"5 Square 43.3190 2.341423 2025-11-12 12:44:20+00:00\n",
|
|
"6 Rollout -0.2645 4.696591 2025-11-12 12:42:15+00:00\n",
|
|
"7 Square 42.1850 4.696591 2025-11-12 12:42:15+00:00\n",
|
|
"8 Counter -37.8385 4.696591 2025-11-12 12:42:15+00:00\n",
|
|
"9 Square 2.8880 -70.845157 2025-11-11 23:00:48+00:00\n",
|
|
"10 Rollout 18.7945 -70.845157 2025-11-11 23:00:48+00:00\n",
|
|
"11 Counter -12.6565 -70.845157 2025-11-11 23:00:48+00:00\n",
|
|
"12 Rollout 17.7415 -71.894590 2025-11-11 23:00:18+00:00\n",
|
|
"13 Counter -11.1570 -71.894590 2025-11-11 23:00:18+00:00\n",
|
|
"14 Square 2.1610 -71.894590 2025-11-11 23:00:18+00:00\n",
|
|
"15 Square -2.0490 -67.033953 2025-11-11 22:59:48+00:00\n",
|
|
"16 Rollout 16.5365 -67.033953 2025-11-11 22:59:48+00:00\n",
|
|
"17 Counter -15.2205 -67.033953 2025-11-11 22:59:48+00:00\n",
|
|
"18 Counter -11.7930 -70.514462 2025-11-11 22:59:18+00:00\n",
|
|
"19 Square -4.3350 -70.514462 2025-11-11 22:59:18+00:00\n",
|
|
"20 Rollout 16.3065 -70.514462 2025-11-11 22:59:18+00:00\n",
|
|
"21 Square 0.6840 -72.523279 2025-11-11 22:58:48+00:00\n",
|
|
"22 Counter -9.2570 -72.523279 2025-11-11 22:58:48+00:00\n",
|
|
"23 Rollout 14.9965 -72.523279 2025-11-11 22:58:48+00:00\n",
|
|
"24 Square 1.1700 -72.831684 2025-11-11 22:58:18+00:00\n",
|
|
"25 Counter -7.0635 -72.831684 2025-11-11 22:58:18+00:00\n",
|
|
"26 Rollout 10.9875 -72.831684 2025-11-11 22:58:18+00:00\n",
|
|
"27 Counter -2.0110 -77.865944 2025-11-11 22:57:48+00:00\n",
|
|
"28 Rollout 10.4545 -77.865944 2025-11-11 22:57:48+00:00\n",
|
|
"29 Square -0.2070 -77.865944 2025-11-11 22:57:48+00:00"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>variable</th>\n",
|
|
" <th>value</th>\n",
|
|
" <th>prediction</th>\n",
|
|
" <th>timestamp</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>Square</td>\n",
|
|
" <td>42.2950</td>\n",
|
|
" <td>-3.018465</td>\n",
|
|
" <td>2025-11-12 12:44:50</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>1.8610</td>\n",
|
|
" <td>-3.018465</td>\n",
|
|
" <td>2025-11-12 12:44:50</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>-45.0980</td>\n",
|
|
" <td>-3.018465</td>\n",
|
|
" <td>2025-11-12 12:44:50</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>0.3970</td>\n",
|
|
" <td>2.341423</td>\n",
|
|
" <td>2025-11-12 12:44:20</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>-40.0260</td>\n",
|
|
" <td>2.341423</td>\n",
|
|
" <td>2025-11-12 12:44:20</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>5</th>\n",
|
|
" <td>Square</td>\n",
|
|
" <td>43.3190</td>\n",
|
|
" <td>2.341423</td>\n",
|
|
" <td>2025-11-12 12:44:20</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>6</th>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>-0.2645</td>\n",
|
|
" <td>4.696591</td>\n",
|
|
" <td>2025-11-12 12:42:15</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>7</th>\n",
|
|
" <td>Square</td>\n",
|
|
" <td>42.1850</td>\n",
|
|
" <td>4.696591</td>\n",
|
|
" <td>2025-11-12 12:42:15</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>8</th>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>-37.8385</td>\n",
|
|
" <td>4.696591</td>\n",
|
|
" <td>2025-11-12 12:42:15</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>9</th>\n",
|
|
" <td>Square</td>\n",
|
|
" <td>2.8880</td>\n",
|
|
" <td>-70.845157</td>\n",
|
|
" <td>2025-11-11 23:00:48</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>10</th>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>18.7945</td>\n",
|
|
" <td>-70.845157</td>\n",
|
|
" <td>2025-11-11 23:00:48</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>11</th>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>-12.6565</td>\n",
|
|
" <td>-70.845157</td>\n",
|
|
" <td>2025-11-11 23:00:48</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>12</th>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>17.7415</td>\n",
|
|
" <td>-71.894590</td>\n",
|
|
" <td>2025-11-11 23:00:18</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>13</th>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>-11.1570</td>\n",
|
|
" <td>-71.894590</td>\n",
|
|
" <td>2025-11-11 23:00:18</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>14</th>\n",
|
|
" <td>Square</td>\n",
|
|
" <td>2.1610</td>\n",
|
|
" <td>-71.894590</td>\n",
|
|
" <td>2025-11-11 23:00:18</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>15</th>\n",
|
|
" <td>Square</td>\n",
|
|
" <td>-2.0490</td>\n",
|
|
" <td>-67.033953</td>\n",
|
|
" <td>2025-11-11 22:59:48</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>16</th>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>16.5365</td>\n",
|
|
" <td>-67.033953</td>\n",
|
|
" <td>2025-11-11 22:59:48</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>17</th>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>-15.2205</td>\n",
|
|
" <td>-67.033953</td>\n",
|
|
" <td>2025-11-11 22:59:48</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>18</th>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>-11.7930</td>\n",
|
|
" <td>-70.514462</td>\n",
|
|
" <td>2025-11-11 22:59:18</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>19</th>\n",
|
|
" <td>Square</td>\n",
|
|
" <td>-4.3350</td>\n",
|
|
" <td>-70.514462</td>\n",
|
|
" <td>2025-11-11 22:59:18</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>20</th>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>16.3065</td>\n",
|
|
" <td>-70.514462</td>\n",
|
|
" <td>2025-11-11 22:59:18</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>21</th>\n",
|
|
" <td>Square</td>\n",
|
|
" <td>0.6840</td>\n",
|
|
" <td>-72.523279</td>\n",
|
|
" <td>2025-11-11 22:58:48</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>22</th>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>-9.2570</td>\n",
|
|
" <td>-72.523279</td>\n",
|
|
" <td>2025-11-11 22:58:48</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>23</th>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>14.9965</td>\n",
|
|
" <td>-72.523279</td>\n",
|
|
" <td>2025-11-11 22:58:48</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>24</th>\n",
|
|
" <td>Square</td>\n",
|
|
" <td>1.1700</td>\n",
|
|
" <td>-72.831684</td>\n",
|
|
" <td>2025-11-11 22:58:18</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>25</th>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>-7.0635</td>\n",
|
|
" <td>-72.831684</td>\n",
|
|
" <td>2025-11-11 22:58:18</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>26</th>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>10.9875</td>\n",
|
|
" <td>-72.831684</td>\n",
|
|
" <td>2025-11-11 22:58:18</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>27</th>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>-2.0110</td>\n",
|
|
" <td>-77.865944</td>\n",
|
|
" <td>2025-11-11 22:57:48</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>28</th>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>10.4545</td>\n",
|
|
" <td>-77.865944</td>\n",
|
|
" <td>2025-11-11 22:57:48</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>29</th>\n",
|
|
" <td>Square</td>\n",
|
|
" <td>-0.2070</td>\n",
|
|
" <td>-77.865944</td>\n",
|
|
" <td>2025-11-11 22:57:48</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" variable value prediction timestamp\n",
|
|
"0 Square 42.2950 -3.018465 2025-11-12 12:44:50\n",
|
|
"1 Rollout 1.8610 -3.018465 2025-11-12 12:44:50\n",
|
|
"2 Counter -45.0980 -3.018465 2025-11-12 12:44:50\n",
|
|
"3 Rollout 0.3970 2.341423 2025-11-12 12:44:20\n",
|
|
"4 Counter -40.0260 2.341423 2025-11-12 12:44:20\n",
|
|
"5 Square 43.3190 2.341423 2025-11-12 12:44:20\n",
|
|
"6 Rollout -0.2645 4.696591 2025-11-12 12:42:15\n",
|
|
"7 Square 42.1850 4.696591 2025-11-12 12:42:15\n",
|
|
"8 Counter -37.8385 4.696591 2025-11-12 12:42:15\n",
|
|
"9 Square 2.8880 -70.845157 2025-11-11 23:00:48\n",
|
|
"10 Rollout 18.7945 -70.845157 2025-11-11 23:00:48\n",
|
|
"11 Counter -12.6565 -70.845157 2025-11-11 23:00:48\n",
|
|
"12 Rollout 17.7415 -71.894590 2025-11-11 23:00:18\n",
|
|
"13 Counter -11.1570 -71.894590 2025-11-11 23:00:18\n",
|
|
"14 Square 2.1610 -71.894590 2025-11-11 23:00:18\n",
|
|
"15 Square -2.0490 -67.033953 2025-11-11 22:59:48\n",
|
|
"16 Rollout 16.5365 -67.033953 2025-11-11 22:59:48\n",
|
|
"17 Counter -15.2205 -67.033953 2025-11-11 22:59:48\n",
|
|
"18 Counter -11.7930 -70.514462 2025-11-11 22:59:18\n",
|
|
"19 Square -4.3350 -70.514462 2025-11-11 22:59:18\n",
|
|
"20 Rollout 16.3065 -70.514462 2025-11-11 22:59:18\n",
|
|
"21 Square 0.6840 -72.523279 2025-11-11 22:58:48\n",
|
|
"22 Counter -9.2570 -72.523279 2025-11-11 22:58:48\n",
|
|
"23 Rollout 14.9965 -72.523279 2025-11-11 22:58:48\n",
|
|
"24 Square 1.1700 -72.831684 2025-11-11 22:58:18\n",
|
|
"25 Counter -7.0635 -72.831684 2025-11-11 22:58:18\n",
|
|
"26 Rollout 10.9875 -72.831684 2025-11-11 22:58:18\n",
|
|
"27 Counter -2.0110 -77.865944 2025-11-11 22:57:48\n",
|
|
"28 Rollout 10.4545 -77.865944 2025-11-11 22:57:48\n",
|
|
"29 Square -0.2070 -77.865944 2025-11-11 22:57:48"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"from pandas import DataFrame, to_datetime\n",
|
|
"\n",
|
|
"query_data = \"\"\"\n",
|
|
"select ld.variable, ld.value, p.prediction, p.\"timestamp\"\n",
|
|
"from sientia_data.laborious_data ld\n",
|
|
" right join sientia_data.predictions p \n",
|
|
" on ld.timestamp = p.timestamp\n",
|
|
" and ld.model_id = p.model_id\n",
|
|
" where\n",
|
|
" ld.model_id = '1'\n",
|
|
" order by\n",
|
|
" ld.created_at desc limit 30;\n",
|
|
"\"\"\"\n",
|
|
"\n",
|
|
"input_data = {\n",
|
|
" \"query\": query_data,\n",
|
|
" \"metadata\": {}\n",
|
|
"}\n",
|
|
"\n",
|
|
"\n",
|
|
"raw_data = DataFrame(await postgres.load_custom_query(\n",
|
|
" input_data))\n",
|
|
"\n",
|
|
"raw_data['timestamp'] = to_datetime(raw_data['timestamp'])\n",
|
|
"raw_data['timestamp'] = raw_data['timestamp'].dt.strftime('%Y-%m-%d %H:%M:%S')\n",
|
|
"\n",
|
|
"display(raw_data)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"id": "297f648f",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>timestamp</th>\n",
|
|
" <th>prediction</th>\n",
|
|
" <th>Counter</th>\n",
|
|
" <th>Rollout</th>\n",
|
|
" <th>Square</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>2025-11-11 22:57:48</td>\n",
|
|
" <td>-77.865944</td>\n",
|
|
" <td>-2.0110</td>\n",
|
|
" <td>10.4545</td>\n",
|
|
" <td>-0.207</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>2025-11-11 22:58:18</td>\n",
|
|
" <td>-72.831684</td>\n",
|
|
" <td>-7.0635</td>\n",
|
|
" <td>10.9875</td>\n",
|
|
" <td>1.170</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>2025-11-11 22:58:48</td>\n",
|
|
" <td>-72.523279</td>\n",
|
|
" <td>-9.2570</td>\n",
|
|
" <td>14.9965</td>\n",
|
|
" <td>0.684</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>2025-11-11 22:59:18</td>\n",
|
|
" <td>-70.514462</td>\n",
|
|
" <td>-11.7930</td>\n",
|
|
" <td>16.3065</td>\n",
|
|
" <td>-4.335</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>2025-11-11 22:59:48</td>\n",
|
|
" <td>-67.033953</td>\n",
|
|
" <td>-15.2205</td>\n",
|
|
" <td>16.5365</td>\n",
|
|
" <td>-2.049</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>5</th>\n",
|
|
" <td>2025-11-11 23:00:18</td>\n",
|
|
" <td>-71.894590</td>\n",
|
|
" <td>-11.1570</td>\n",
|
|
" <td>17.7415</td>\n",
|
|
" <td>2.161</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>6</th>\n",
|
|
" <td>2025-11-11 23:00:48</td>\n",
|
|
" <td>-70.845157</td>\n",
|
|
" <td>-12.6565</td>\n",
|
|
" <td>18.7945</td>\n",
|
|
" <td>2.888</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>7</th>\n",
|
|
" <td>2025-11-12 12:42:15</td>\n",
|
|
" <td>4.696591</td>\n",
|
|
" <td>-37.8385</td>\n",
|
|
" <td>-0.2645</td>\n",
|
|
" <td>42.185</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>8</th>\n",
|
|
" <td>2025-11-12 12:44:20</td>\n",
|
|
" <td>2.341423</td>\n",
|
|
" <td>-40.0260</td>\n",
|
|
" <td>0.3970</td>\n",
|
|
" <td>43.319</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>9</th>\n",
|
|
" <td>2025-11-12 12:44:50</td>\n",
|
|
" <td>-3.018465</td>\n",
|
|
" <td>-45.0980</td>\n",
|
|
" <td>1.8610</td>\n",
|
|
" <td>42.295</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" timestamp prediction Counter Rollout Square\n",
|
|
"0 2025-11-11 22:57:48 -77.865944 -2.0110 10.4545 -0.207\n",
|
|
"1 2025-11-11 22:58:18 -72.831684 -7.0635 10.9875 1.170\n",
|
|
"2 2025-11-11 22:58:48 -72.523279 -9.2570 14.9965 0.684\n",
|
|
"3 2025-11-11 22:59:18 -70.514462 -11.7930 16.3065 -4.335\n",
|
|
"4 2025-11-11 22:59:48 -67.033953 -15.2205 16.5365 -2.049\n",
|
|
"5 2025-11-11 23:00:18 -71.894590 -11.1570 17.7415 2.161\n",
|
|
"6 2025-11-11 23:00:48 -70.845157 -12.6565 18.7945 2.888\n",
|
|
"7 2025-11-12 12:42:15 4.696591 -37.8385 -0.2645 42.185\n",
|
|
"8 2025-11-12 12:44:20 2.341423 -40.0260 0.3970 43.319\n",
|
|
"9 2025-11-12 12:44:50 -3.018465 -45.0980 1.8610 42.295"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"from pandas import merge, pivot\n",
|
|
"\n",
|
|
"raw_data.drop_duplicates(subset=[\"timestamp\", \"prediction\", \"variable\"], inplace=True, keep=\"first\")\n",
|
|
"data = raw_data.pivot(index=[\"timestamp\", \"prediction\"], columns=\"variable\", values=\"value\")\n",
|
|
"\n",
|
|
"data.columns.name = None\n",
|
|
"data.reset_index(inplace=True)\n",
|
|
"display(data)\n",
|
|
"\n",
|
|
"\n",
|
|
"drift_methods = ['kolmogorov_smirnov']#, 'jensen_shannon', 'wasserstein']\n",
|
|
"chunk_period = 's'\n",
|
|
"target_col = \"Square\"\n",
|
|
"timestamp_col = \"timestamp\"\n",
|
|
"\n",
|
|
"data.to_csv(\"data.csv\", index=False)\n",
|
|
"\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"id": "9ab4774a",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"from mlflow.tracking import MlflowClient\n",
|
|
"from os import environ\n",
|
|
"\n",
|
|
"environ['MLFLOW_TRACKING_USERNAME'] = 'aignosi'\n",
|
|
"environ['MLFLOW_TRACKING_PASSWORD'] = '1L0FP50j3ncp123'\n",
|
|
"environ['MLFLOW_TRACKING_URI'] = 'http://localhost:5080'\n",
|
|
"mlflow_client = MlflowClient()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 19,
|
|
"id": "e8427625",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"True"
|
|
]
|
|
},
|
|
"execution_count": 19,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"run_id = '9e9fa748822c44ab92dd769d6a45c4f4'\n",
|
|
"output_dir = './tmp/model'\n",
|
|
"\n",
|
|
"artifacts = mlflow_client.list_artifacts(run_id)\n",
|
|
"paths = [artifact.path for artifact in artifacts]\n",
|
|
"\n",
|
|
"any(artifact.path == 'retrain_data.csv' for artifact in artifacts)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"id": "cf4ddf41",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>timestamp</th>\n",
|
|
" <th>Counter</th>\n",
|
|
" <th>Rollout</th>\n",
|
|
" <th>Square</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>2025-11-10 18:58:39</td>\n",
|
|
" <td>13.5970</td>\n",
|
|
" <td>-52.4500</td>\n",
|
|
" <td>43.381</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>2025-11-10 18:58:49</td>\n",
|
|
" <td>15.0660</td>\n",
|
|
" <td>-50.0240</td>\n",
|
|
" <td>45.813</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>2025-11-10 18:58:54</td>\n",
|
|
" <td>14.2780</td>\n",
|
|
" <td>-49.4810</td>\n",
|
|
" <td>47.677</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>2025-11-10 18:59:04</td>\n",
|
|
" <td>14.2080</td>\n",
|
|
" <td>-51.8015</td>\n",
|
|
" <td>48.995</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>2025-11-10 18:59:09</td>\n",
|
|
" <td>16.3530</td>\n",
|
|
" <td>-52.6850</td>\n",
|
|
" <td>47.745</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>5</th>\n",
|
|
" <td>2025-11-10 18:59:19</td>\n",
|
|
" <td>15.5415</td>\n",
|
|
" <td>-53.5625</td>\n",
|
|
" <td>48.327</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>6</th>\n",
|
|
" <td>2025-11-10 18:59:24</td>\n",
|
|
" <td>16.8580</td>\n",
|
|
" <td>-53.6960</td>\n",
|
|
" <td>47.160</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>7</th>\n",
|
|
" <td>2025-11-10 18:59:34</td>\n",
|
|
" <td>14.9745</td>\n",
|
|
" <td>-54.7510</td>\n",
|
|
" <td>48.480</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>8</th>\n",
|
|
" <td>2025-11-10 18:59:39</td>\n",
|
|
" <td>12.3020</td>\n",
|
|
" <td>-53.4330</td>\n",
|
|
" <td>48.631</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>9</th>\n",
|
|
" <td>2025-11-10 18:59:49</td>\n",
|
|
" <td>12.5640</td>\n",
|
|
" <td>-52.9805</td>\n",
|
|
" <td>50.130</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" timestamp Counter Rollout Square\n",
|
|
"0 2025-11-10 18:58:39 13.5970 -52.4500 43.381\n",
|
|
"1 2025-11-10 18:58:49 15.0660 -50.0240 45.813\n",
|
|
"2 2025-11-10 18:58:54 14.2780 -49.4810 47.677\n",
|
|
"3 2025-11-10 18:59:04 14.2080 -51.8015 48.995\n",
|
|
"4 2025-11-10 18:59:09 16.3530 -52.6850 47.745\n",
|
|
"5 2025-11-10 18:59:19 15.5415 -53.5625 48.327\n",
|
|
"6 2025-11-10 18:59:24 16.8580 -53.6960 47.160\n",
|
|
"7 2025-11-10 18:59:34 14.9745 -54.7510 48.480\n",
|
|
"8 2025-11-10 18:59:39 12.3020 -53.4330 48.631\n",
|
|
"9 2025-11-10 18:59:49 12.5640 -52.9805 50.130"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"import mlflow\n",
|
|
"from io import StringIO\n",
|
|
"from pandas import read_csv\n",
|
|
"\n",
|
|
"if 'retrain_data.csv' in paths:\n",
|
|
" artifact_path = 'retrain_data.csv'\n",
|
|
"elif 'train_data.csv' in paths:\n",
|
|
" artifact_path = 'train_data.csv'\n",
|
|
"else:\n",
|
|
" raise RuntimeError(\n",
|
|
" f\"Could not find 'train_data.csv' or 'retrain_data.csv' for run_id '{run_id}'.\\n\"\n",
|
|
" )\n",
|
|
"\n",
|
|
"# Carregar diretamente na memória como string\n",
|
|
"artifact_content = mlflow.artifacts.load_text(\n",
|
|
" f\"runs:/{run_id}/{artifact_path}\"\n",
|
|
")\n",
|
|
"\n",
|
|
"reference_df = read_csv(StringIO(artifact_content))\n",
|
|
"\n",
|
|
"reference_df.drop(columns=['timestamp.1'], inplace=True)\n",
|
|
"\n",
|
|
"reference_df['timestamp'] = to_datetime(reference_df['timestamp'])\n",
|
|
"reference_df['timestamp'] = reference_df['timestamp'].dt.strftime('%Y-%m-%d %H:%M:%S')\n",
|
|
"\n",
|
|
"display(reference_df)\n",
|
|
"\n",
|
|
"reference_df.to_csv(\"reference_df.csv\", index=False)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 20,
|
|
"id": "d375752b",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"<class 'pandas._libs.tslibs.timestamps.Timestamp'>\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"/home/grezewave/Documents/projects/sientia/sientia-dataops-orchestrator_temporal/venv/lib/python3.11/site-packages/numpy/core/_methods.py:206: RuntimeWarning: Degrees of freedom <= 0 for slice\n",
|
|
" ret = _var(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n",
|
|
"/home/grezewave/Documents/projects/sientia/sientia-dataops-orchestrator_temporal/venv/lib/python3.11/site-packages/numpy/core/_methods.py:198: RuntimeWarning: invalid value encountered in scalar divide\n",
|
|
" ret = ret.dtype.type(ret / rcount)\n",
|
|
"/home/grezewave/Documents/projects/sientia/sientia-dataops-orchestrator_temporal/venv/lib/python3.11/site-packages/numpy/core/_methods.py:206: RuntimeWarning: Degrees of freedom <= 0 for slice\n",
|
|
" ret = _var(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n",
|
|
"/home/grezewave/Documents/projects/sientia/sientia-dataops-orchestrator_temporal/venv/lib/python3.11/site-packages/numpy/core/_methods.py:198: RuntimeWarning: invalid value encountered in scalar divide\n",
|
|
" ret = ret.dtype.type(ret / rcount)\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>timestamp</th>\n",
|
|
" <th>feature</th>\n",
|
|
" <th>metric</th>\n",
|
|
" <th>statistic</th>\n",
|
|
" <th>p_value</th>\n",
|
|
" <th>alert</th>\n",
|
|
" <th>chunk_index</th>\n",
|
|
" <th>chunk_start_date</th>\n",
|
|
" <th>chunk_end_date</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>2025-11-10 18:58:00+0000</td>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>3.000000e-01</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>2025-11-10 18:58</td>\n",
|
|
" <td>2025-11-10 18:58:59.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>2025-11-10 18:59:00+0000</td>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.285714e-01</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>2025-11-10 18:59</td>\n",
|
|
" <td>2025-11-10 18:59:59.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>2025-11-11 22:57:00+0000</td>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>2025-11-11 22:57</td>\n",
|
|
" <td>2025-11-11 22:57:59.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>2025-11-11 22:58:00+0000</td>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>2025-11-11 22:58</td>\n",
|
|
" <td>2025-11-11 22:58:59.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>2025-11-11 22:59:00+0000</td>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2025-11-11 22:59</td>\n",
|
|
" <td>2025-11-11 22:59:59.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>5</th>\n",
|
|
" <td>2025-11-11 23:00:00+0000</td>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>2025-11-11 23:00</td>\n",
|
|
" <td>2025-11-11 23:00:59.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>6</th>\n",
|
|
" <td>2025-11-12 12:42:00+0000</td>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>2025-11-12 12:42</td>\n",
|
|
" <td>2025-11-12 12:42:59.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>7</th>\n",
|
|
" <td>2025-11-12 12:44:00+0000</td>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>2025-11-12 12:44</td>\n",
|
|
" <td>2025-11-12 12:44:59.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>8</th>\n",
|
|
" <td>2025-11-10 18:58:00+0000</td>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>6.000000e-01</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>2025-11-10 18:58</td>\n",
|
|
" <td>2025-11-10 18:58:59.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>9</th>\n",
|
|
" <td>2025-11-10 18:59:00+0000</td>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>2.571429e-01</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>2025-11-10 18:59</td>\n",
|
|
" <td>2025-11-10 18:59:59.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>10</th>\n",
|
|
" <td>2025-11-11 22:57:00+0000</td>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>2025-11-11 22:57</td>\n",
|
|
" <td>2025-11-11 22:57:59.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>11</th>\n",
|
|
" <td>2025-11-11 22:58:00+0000</td>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>2025-11-11 22:58</td>\n",
|
|
" <td>2025-11-11 22:58:59.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>12</th>\n",
|
|
" <td>2025-11-11 22:59:00+0000</td>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2025-11-11 22:59</td>\n",
|
|
" <td>2025-11-11 22:59:59.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>13</th>\n",
|
|
" <td>2025-11-11 23:00:00+0000</td>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>2025-11-11 23:00</td>\n",
|
|
" <td>2025-11-11 23:00:59.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>14</th>\n",
|
|
" <td>2025-11-12 12:42:00+0000</td>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>2025-11-12 12:42</td>\n",
|
|
" <td>2025-11-12 12:42:59.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>15</th>\n",
|
|
" <td>2025-11-12 12:44:00+0000</td>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>2025-11-12 12:44</td>\n",
|
|
" <td>2025-11-12 12:44:59.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>16</th>\n",
|
|
" <td>2025-11-10 18:58:00+0000</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>2.015043e-16</td>\n",
|
|
" <td>3.748123e-17</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>2025-11-10 18:58</td>\n",
|
|
" <td>2025-11-10 18:58:59.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>17</th>\n",
|
|
" <td>2025-11-10 18:59:00+0000</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>2.493220e-16</td>\n",
|
|
" <td>3.998584e-17</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>2025-11-10 18:59</td>\n",
|
|
" <td>2025-11-10 18:59:59.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>18</th>\n",
|
|
" <td>2025-11-11 22:57:00+0000</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>1.432145e-14</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>2025-11-11 22:57</td>\n",
|
|
" <td>2025-11-11 22:57:59.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>19</th>\n",
|
|
" <td>2025-11-11 22:58:00+0000</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>1.234840e-14</td>\n",
|
|
" <td>2.299811e-15</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>2025-11-11 22:58</td>\n",
|
|
" <td>2025-11-11 22:58:59.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>20</th>\n",
|
|
" <td>2025-11-11 22:59:00+0000</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>7.944109e-15</td>\n",
|
|
" <td>0.000000e+00</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2025-11-11 22:59</td>\n",
|
|
" <td>2025-11-11 22:59:59.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>21</th>\n",
|
|
" <td>2025-11-11 23:00:00+0000</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>7.524768e-15</td>\n",
|
|
" <td>4.193410e-16</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>2025-11-11 23:00</td>\n",
|
|
" <td>2025-11-11 23:00:59.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>22</th>\n",
|
|
" <td>2025-11-12 12:42:00+0000</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>1.004859e-14</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>2025-11-12 12:42</td>\n",
|
|
" <td>2025-11-12 12:42:59.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>23</th>\n",
|
|
" <td>2025-11-12 12:44:00+0000</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>1.004859e-14</td>\n",
|
|
" <td>0.000000e+00</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>2025-11-12 12:44</td>\n",
|
|
" <td>2025-11-12 12:44:59.999999999</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" timestamp feature metric statistic \\\n",
|
|
"0 2025-11-10 18:58:00+0000 Counter kolmogorov_smirnov 3.000000e-01 \n",
|
|
"1 2025-11-10 18:59:00+0000 Counter kolmogorov_smirnov 1.285714e-01 \n",
|
|
"2 2025-11-11 22:57:00+0000 Counter kolmogorov_smirnov 1.000000e+00 \n",
|
|
"3 2025-11-11 22:58:00+0000 Counter kolmogorov_smirnov 1.000000e+00 \n",
|
|
"4 2025-11-11 22:59:00+0000 Counter kolmogorov_smirnov 1.000000e+00 \n",
|
|
"5 2025-11-11 23:00:00+0000 Counter kolmogorov_smirnov 1.000000e+00 \n",
|
|
"6 2025-11-12 12:42:00+0000 Counter kolmogorov_smirnov 1.000000e+00 \n",
|
|
"7 2025-11-12 12:44:00+0000 Counter kolmogorov_smirnov 1.000000e+00 \n",
|
|
"8 2025-11-10 18:58:00+0000 Rollout kolmogorov_smirnov 6.000000e-01 \n",
|
|
"9 2025-11-10 18:59:00+0000 Rollout kolmogorov_smirnov 2.571429e-01 \n",
|
|
"10 2025-11-11 22:57:00+0000 Rollout kolmogorov_smirnov 1.000000e+00 \n",
|
|
"11 2025-11-11 22:58:00+0000 Rollout kolmogorov_smirnov 1.000000e+00 \n",
|
|
"12 2025-11-11 22:59:00+0000 Rollout kolmogorov_smirnov 1.000000e+00 \n",
|
|
"13 2025-11-11 23:00:00+0000 Rollout kolmogorov_smirnov 1.000000e+00 \n",
|
|
"14 2025-11-12 12:42:00+0000 Rollout kolmogorov_smirnov 1.000000e+00 \n",
|
|
"15 2025-11-12 12:44:00+0000 Rollout kolmogorov_smirnov 1.000000e+00 \n",
|
|
"16 2025-11-10 18:58:00+0000 multivariate multivariate 2.015043e-16 \n",
|
|
"17 2025-11-10 18:59:00+0000 multivariate multivariate 2.493220e-16 \n",
|
|
"18 2025-11-11 22:57:00+0000 multivariate multivariate 1.432145e-14 \n",
|
|
"19 2025-11-11 22:58:00+0000 multivariate multivariate 1.234840e-14 \n",
|
|
"20 2025-11-11 22:59:00+0000 multivariate multivariate 7.944109e-15 \n",
|
|
"21 2025-11-11 23:00:00+0000 multivariate multivariate 7.524768e-15 \n",
|
|
"22 2025-11-12 12:42:00+0000 multivariate multivariate 1.004859e-14 \n",
|
|
"23 2025-11-12 12:44:00+0000 multivariate multivariate 1.004859e-14 \n",
|
|
"\n",
|
|
" p_value alert chunk_index chunk_start_date \\\n",
|
|
"0 NaN False 0 2025-11-10 18:58 \n",
|
|
"1 NaN False 1 2025-11-10 18:59 \n",
|
|
"2 NaN True 0 2025-11-11 22:57 \n",
|
|
"3 NaN True 1 2025-11-11 22:58 \n",
|
|
"4 NaN True 2 2025-11-11 22:59 \n",
|
|
"5 NaN True 3 2025-11-11 23:00 \n",
|
|
"6 NaN True 4 2025-11-12 12:42 \n",
|
|
"7 NaN True 5 2025-11-12 12:44 \n",
|
|
"8 NaN False 0 2025-11-10 18:58 \n",
|
|
"9 NaN False 1 2025-11-10 18:59 \n",
|
|
"10 NaN True 0 2025-11-11 22:57 \n",
|
|
"11 NaN True 1 2025-11-11 22:58 \n",
|
|
"12 NaN True 2 2025-11-11 22:59 \n",
|
|
"13 NaN True 3 2025-11-11 23:00 \n",
|
|
"14 NaN True 4 2025-11-12 12:42 \n",
|
|
"15 NaN True 5 2025-11-12 12:44 \n",
|
|
"16 3.748123e-17 False 0 2025-11-10 18:58 \n",
|
|
"17 3.998584e-17 False 1 2025-11-10 18:59 \n",
|
|
"18 NaN True 0 2025-11-11 22:57 \n",
|
|
"19 2.299811e-15 True 1 2025-11-11 22:58 \n",
|
|
"20 0.000000e+00 True 2 2025-11-11 22:59 \n",
|
|
"21 4.193410e-16 True 3 2025-11-11 23:00 \n",
|
|
"22 NaN True 4 2025-11-12 12:42 \n",
|
|
"23 0.000000e+00 True 5 2025-11-12 12:44 \n",
|
|
"\n",
|
|
" chunk_end_date \n",
|
|
"0 2025-11-10 18:58:59.999999999 \n",
|
|
"1 2025-11-10 18:59:59.999999999 \n",
|
|
"2 2025-11-11 22:57:59.999999999 \n",
|
|
"3 2025-11-11 22:58:59.999999999 \n",
|
|
"4 2025-11-11 22:59:59.999999999 \n",
|
|
"5 2025-11-11 23:00:59.999999999 \n",
|
|
"6 2025-11-12 12:42:59.999999999 \n",
|
|
"7 2025-11-12 12:44:59.999999999 \n",
|
|
"8 2025-11-10 18:58:59.999999999 \n",
|
|
"9 2025-11-10 18:59:59.999999999 \n",
|
|
"10 2025-11-11 22:57:59.999999999 \n",
|
|
"11 2025-11-11 22:58:59.999999999 \n",
|
|
"12 2025-11-11 22:59:59.999999999 \n",
|
|
"13 2025-11-11 23:00:59.999999999 \n",
|
|
"14 2025-11-12 12:42:59.999999999 \n",
|
|
"15 2025-11-12 12:44:59.999999999 \n",
|
|
"16 2025-11-10 18:58:59.999999999 \n",
|
|
"17 2025-11-10 18:59:59.999999999 \n",
|
|
"18 2025-11-11 22:57:59.999999999 \n",
|
|
"19 2025-11-11 22:58:59.999999999 \n",
|
|
"20 2025-11-11 22:59:59.999999999 \n",
|
|
"21 2025-11-11 23:00:59.999999999 \n",
|
|
"22 2025-11-12 12:42:59.999999999 \n",
|
|
"23 2025-11-12 12:44:59.999999999 "
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"\n",
|
|
"\n",
|
|
"from sientia_do.temporal.constants import DATETIME_FORMAT_WITH_TZ\n",
|
|
"\n",
|
|
"\n",
|
|
"univariate_drift = model.detect_univariate_drift(\n",
|
|
" reference_df=reference_df,\n",
|
|
" analysis_df=data,\n",
|
|
" features=config['features'],\n",
|
|
" timestamp_col=timestamp_col,\n",
|
|
" methods=drift_methods,\n",
|
|
" chunk_period=\"min\"\n",
|
|
")\n",
|
|
"multivariate_drift = model.detect_multivariate_drift(\n",
|
|
" reference_df=reference_df,\n",
|
|
" analysis_df=data,\n",
|
|
" features=config['features'],\n",
|
|
" timestamp_col=timestamp_col,\n",
|
|
" chunk_period=\"min\"\n",
|
|
")\n",
|
|
"\n",
|
|
"drift = model.get_drift_metrics_dataframe(\n",
|
|
" univariate_drift=univariate_drift,\n",
|
|
" multivariate_drift=multivariate_drift\n",
|
|
")\n",
|
|
"drift.drop_duplicates(subset=[\"timestamp\", \"feature\", \"metric\"], inplace=True, keep=\"first\")\n",
|
|
"drift.reset_index(drop=True, inplace=True)\n",
|
|
"\n",
|
|
"drift['timestamp'] = to_datetime(drift['timestamp'])\n",
|
|
"print(type(drift['timestamp'].iloc[0]))\n",
|
|
"\n",
|
|
"# Add timezone UTC to timestamp\n",
|
|
"drift['timestamp'] = drift['timestamp'].dt.tz_localize('UTC')\n",
|
|
"drift['timestamp'] = drift['timestamp'].dt.strftime(DATETIME_FORMAT_WITH_TZ)\n",
|
|
"\n",
|
|
"display(drift)\n",
|
|
"drift.to_csv(\"drift.csv\", index=False)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 32,
|
|
"id": "d30f6475",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>timestamp</th>\n",
|
|
" <th>feature</th>\n",
|
|
" <th>metric</th>\n",
|
|
" <th>statistic</th>\n",
|
|
" <th>p_value</th>\n",
|
|
" <th>alert</th>\n",
|
|
" <th>chunk_index</th>\n",
|
|
" <th>chunk_start_date</th>\n",
|
|
" <th>chunk_end_date</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>10</th>\n",
|
|
" <td>2025-11-11 11:55:18</td>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>2025-11-11 11:55:18</td>\n",
|
|
" <td>2025-11-11 11:55:18.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>11</th>\n",
|
|
" <td>2025-11-11 11:55:48</td>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>2025-11-11 11:55:48</td>\n",
|
|
" <td>2025-11-11 11:55:48.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>12</th>\n",
|
|
" <td>2025-11-11 11:56:18</td>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2025-11-11 11:56:18</td>\n",
|
|
" <td>2025-11-11 11:56:18.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>13</th>\n",
|
|
" <td>2025-11-11 11:56:48</td>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>2025-11-11 11:56:48</td>\n",
|
|
" <td>2025-11-11 11:56:48.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>14</th>\n",
|
|
" <td>2025-11-11 11:57:18</td>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>2025-11-11 11:57:18</td>\n",
|
|
" <td>2025-11-11 11:57:18.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>15</th>\n",
|
|
" <td>2025-11-11 11:57:48</td>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>2025-11-11 11:57:48</td>\n",
|
|
" <td>2025-11-11 11:57:48.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>16</th>\n",
|
|
" <td>2025-11-11 11:58:18</td>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>2025-11-11 11:58:18</td>\n",
|
|
" <td>2025-11-11 11:58:18.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>17</th>\n",
|
|
" <td>2025-11-11 11:58:48</td>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>2025-11-11 11:58:48</td>\n",
|
|
" <td>2025-11-11 11:58:48.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>18</th>\n",
|
|
" <td>2025-11-11 11:59:18</td>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>2025-11-11 11:59:18</td>\n",
|
|
" <td>2025-11-11 11:59:18.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>19</th>\n",
|
|
" <td>2025-11-11 11:59:48</td>\n",
|
|
" <td>Counter</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>9</td>\n",
|
|
" <td>2025-11-11 11:59:48</td>\n",
|
|
" <td>2025-11-11 11:59:48.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>30</th>\n",
|
|
" <td>2025-11-11 11:55:18</td>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>2025-11-11 11:55:18</td>\n",
|
|
" <td>2025-11-11 11:55:18.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>31</th>\n",
|
|
" <td>2025-11-11 11:55:48</td>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>2025-11-11 11:55:48</td>\n",
|
|
" <td>2025-11-11 11:55:48.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>32</th>\n",
|
|
" <td>2025-11-11 11:56:18</td>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2025-11-11 11:56:18</td>\n",
|
|
" <td>2025-11-11 11:56:18.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>33</th>\n",
|
|
" <td>2025-11-11 11:56:48</td>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>2025-11-11 11:56:48</td>\n",
|
|
" <td>2025-11-11 11:56:48.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>34</th>\n",
|
|
" <td>2025-11-11 11:57:18</td>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>2025-11-11 11:57:18</td>\n",
|
|
" <td>2025-11-11 11:57:18.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>35</th>\n",
|
|
" <td>2025-11-11 11:57:48</td>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>2025-11-11 11:57:48</td>\n",
|
|
" <td>2025-11-11 11:57:48.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>36</th>\n",
|
|
" <td>2025-11-11 11:58:18</td>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>2025-11-11 11:58:18</td>\n",
|
|
" <td>2025-11-11 11:58:18.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>37</th>\n",
|
|
" <td>2025-11-11 11:58:48</td>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>2025-11-11 11:58:48</td>\n",
|
|
" <td>2025-11-11 11:58:48.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>38</th>\n",
|
|
" <td>2025-11-11 11:59:18</td>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>2025-11-11 11:59:18</td>\n",
|
|
" <td>2025-11-11 11:59:18.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>39</th>\n",
|
|
" <td>2025-11-11 11:59:48</td>\n",
|
|
" <td>Rollout</td>\n",
|
|
" <td>kolmogorov_smirnov</td>\n",
|
|
" <td>1.000000e+00</td>\n",
|
|
" <td>None</td>\n",
|
|
" <td>False</td>\n",
|
|
" <td>9</td>\n",
|
|
" <td>2025-11-11 11:59:48</td>\n",
|
|
" <td>2025-11-11 11:59:48.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>50</th>\n",
|
|
" <td>2025-11-11 11:55:18</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>1.517720e-14</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>0</td>\n",
|
|
" <td>2025-11-11 11:55:18</td>\n",
|
|
" <td>2025-11-11 11:55:18.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>51</th>\n",
|
|
" <td>2025-11-11 11:55:48</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>1.588822e-14</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>1</td>\n",
|
|
" <td>2025-11-11 11:55:48</td>\n",
|
|
" <td>2025-11-11 11:55:48.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>52</th>\n",
|
|
" <td>2025-11-11 11:56:18</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>1.432145e-14</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>2</td>\n",
|
|
" <td>2025-11-11 11:56:18</td>\n",
|
|
" <td>2025-11-11 11:56:18.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>53</th>\n",
|
|
" <td>2025-11-11 11:56:48</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>1.421085e-14</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>3</td>\n",
|
|
" <td>2025-11-11 11:56:48</td>\n",
|
|
" <td>2025-11-11 11:56:48.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>54</th>\n",
|
|
" <td>2025-11-11 11:57:18</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>1.421085e-14</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>4</td>\n",
|
|
" <td>2025-11-11 11:57:18</td>\n",
|
|
" <td>2025-11-11 11:57:18.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>55</th>\n",
|
|
" <td>2025-11-11 11:57:48</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>1.776357e-15</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>2025-11-11 11:57:48</td>\n",
|
|
" <td>2025-11-11 11:57:48.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>56</th>\n",
|
|
" <td>2025-11-11 11:58:18</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>7.324107e-15</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>6</td>\n",
|
|
" <td>2025-11-11 11:58:18</td>\n",
|
|
" <td>2025-11-11 11:58:18.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>57</th>\n",
|
|
" <td>2025-11-11 11:58:48</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>1.464821e-14</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>7</td>\n",
|
|
" <td>2025-11-11 11:58:48</td>\n",
|
|
" <td>2025-11-11 11:58:48.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>58</th>\n",
|
|
" <td>2025-11-11 11:59:18</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>1.551137e-14</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>8</td>\n",
|
|
" <td>2025-11-11 11:59:18</td>\n",
|
|
" <td>2025-11-11 11:59:18.999999999</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>59</th>\n",
|
|
" <td>2025-11-11 11:59:48</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>multivariate</td>\n",
|
|
" <td>1.427317e-14</td>\n",
|
|
" <td>NaN</td>\n",
|
|
" <td>True</td>\n",
|
|
" <td>9</td>\n",
|
|
" <td>2025-11-11 11:59:48</td>\n",
|
|
" <td>2025-11-11 11:59:48.999999999</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" timestamp feature metric statistic \\\n",
|
|
"10 2025-11-11 11:55:18 Counter kolmogorov_smirnov 1.000000e+00 \n",
|
|
"11 2025-11-11 11:55:48 Counter kolmogorov_smirnov 1.000000e+00 \n",
|
|
"12 2025-11-11 11:56:18 Counter kolmogorov_smirnov 1.000000e+00 \n",
|
|
"13 2025-11-11 11:56:48 Counter kolmogorov_smirnov 1.000000e+00 \n",
|
|
"14 2025-11-11 11:57:18 Counter kolmogorov_smirnov 1.000000e+00 \n",
|
|
"15 2025-11-11 11:57:48 Counter kolmogorov_smirnov 1.000000e+00 \n",
|
|
"16 2025-11-11 11:58:18 Counter kolmogorov_smirnov 1.000000e+00 \n",
|
|
"17 2025-11-11 11:58:48 Counter kolmogorov_smirnov 1.000000e+00 \n",
|
|
"18 2025-11-11 11:59:18 Counter kolmogorov_smirnov 1.000000e+00 \n",
|
|
"19 2025-11-11 11:59:48 Counter kolmogorov_smirnov 1.000000e+00 \n",
|
|
"30 2025-11-11 11:55:18 Rollout kolmogorov_smirnov 1.000000e+00 \n",
|
|
"31 2025-11-11 11:55:48 Rollout kolmogorov_smirnov 1.000000e+00 \n",
|
|
"32 2025-11-11 11:56:18 Rollout kolmogorov_smirnov 1.000000e+00 \n",
|
|
"33 2025-11-11 11:56:48 Rollout kolmogorov_smirnov 1.000000e+00 \n",
|
|
"34 2025-11-11 11:57:18 Rollout kolmogorov_smirnov 1.000000e+00 \n",
|
|
"35 2025-11-11 11:57:48 Rollout kolmogorov_smirnov 1.000000e+00 \n",
|
|
"36 2025-11-11 11:58:18 Rollout kolmogorov_smirnov 1.000000e+00 \n",
|
|
"37 2025-11-11 11:58:48 Rollout kolmogorov_smirnov 1.000000e+00 \n",
|
|
"38 2025-11-11 11:59:18 Rollout kolmogorov_smirnov 1.000000e+00 \n",
|
|
"39 2025-11-11 11:59:48 Rollout kolmogorov_smirnov 1.000000e+00 \n",
|
|
"50 2025-11-11 11:55:18 multivariate multivariate 1.517720e-14 \n",
|
|
"51 2025-11-11 11:55:48 multivariate multivariate 1.588822e-14 \n",
|
|
"52 2025-11-11 11:56:18 multivariate multivariate 1.432145e-14 \n",
|
|
"53 2025-11-11 11:56:48 multivariate multivariate 1.421085e-14 \n",
|
|
"54 2025-11-11 11:57:18 multivariate multivariate 1.421085e-14 \n",
|
|
"55 2025-11-11 11:57:48 multivariate multivariate 1.776357e-15 \n",
|
|
"56 2025-11-11 11:58:18 multivariate multivariate 7.324107e-15 \n",
|
|
"57 2025-11-11 11:58:48 multivariate multivariate 1.464821e-14 \n",
|
|
"58 2025-11-11 11:59:18 multivariate multivariate 1.551137e-14 \n",
|
|
"59 2025-11-11 11:59:48 multivariate multivariate 1.427317e-14 \n",
|
|
"\n",
|
|
" p_value alert chunk_index chunk_start_date \\\n",
|
|
"10 None False 0 2025-11-11 11:55:18 \n",
|
|
"11 None False 1 2025-11-11 11:55:48 \n",
|
|
"12 None False 2 2025-11-11 11:56:18 \n",
|
|
"13 None False 3 2025-11-11 11:56:48 \n",
|
|
"14 None False 4 2025-11-11 11:57:18 \n",
|
|
"15 None False 5 2025-11-11 11:57:48 \n",
|
|
"16 None False 6 2025-11-11 11:58:18 \n",
|
|
"17 None False 7 2025-11-11 11:58:48 \n",
|
|
"18 None False 8 2025-11-11 11:59:18 \n",
|
|
"19 None False 9 2025-11-11 11:59:48 \n",
|
|
"30 None False 0 2025-11-11 11:55:18 \n",
|
|
"31 None False 1 2025-11-11 11:55:48 \n",
|
|
"32 None False 2 2025-11-11 11:56:18 \n",
|
|
"33 None False 3 2025-11-11 11:56:48 \n",
|
|
"34 None False 4 2025-11-11 11:57:18 \n",
|
|
"35 None False 5 2025-11-11 11:57:48 \n",
|
|
"36 None False 6 2025-11-11 11:58:18 \n",
|
|
"37 None False 7 2025-11-11 11:58:48 \n",
|
|
"38 None False 8 2025-11-11 11:59:18 \n",
|
|
"39 None False 9 2025-11-11 11:59:48 \n",
|
|
"50 NaN True 0 2025-11-11 11:55:18 \n",
|
|
"51 NaN True 1 2025-11-11 11:55:48 \n",
|
|
"52 NaN True 2 2025-11-11 11:56:18 \n",
|
|
"53 NaN True 3 2025-11-11 11:56:48 \n",
|
|
"54 NaN True 4 2025-11-11 11:57:18 \n",
|
|
"55 NaN True 5 2025-11-11 11:57:48 \n",
|
|
"56 NaN True 6 2025-11-11 11:58:18 \n",
|
|
"57 NaN True 7 2025-11-11 11:58:48 \n",
|
|
"58 NaN True 8 2025-11-11 11:59:18 \n",
|
|
"59 NaN True 9 2025-11-11 11:59:48 \n",
|
|
"\n",
|
|
" chunk_end_date \n",
|
|
"10 2025-11-11 11:55:18.999999999 \n",
|
|
"11 2025-11-11 11:55:48.999999999 \n",
|
|
"12 2025-11-11 11:56:18.999999999 \n",
|
|
"13 2025-11-11 11:56:48.999999999 \n",
|
|
"14 2025-11-11 11:57:18.999999999 \n",
|
|
"15 2025-11-11 11:57:48.999999999 \n",
|
|
"16 2025-11-11 11:58:18.999999999 \n",
|
|
"17 2025-11-11 11:58:48.999999999 \n",
|
|
"18 2025-11-11 11:59:18.999999999 \n",
|
|
"19 2025-11-11 11:59:48.999999999 \n",
|
|
"30 2025-11-11 11:55:18.999999999 \n",
|
|
"31 2025-11-11 11:55:48.999999999 \n",
|
|
"32 2025-11-11 11:56:18.999999999 \n",
|
|
"33 2025-11-11 11:56:48.999999999 \n",
|
|
"34 2025-11-11 11:57:18.999999999 \n",
|
|
"35 2025-11-11 11:57:48.999999999 \n",
|
|
"36 2025-11-11 11:58:18.999999999 \n",
|
|
"37 2025-11-11 11:58:48.999999999 \n",
|
|
"38 2025-11-11 11:59:18.999999999 \n",
|
|
"39 2025-11-11 11:59:48.999999999 \n",
|
|
"50 2025-11-11 11:55:18.999999999 \n",
|
|
"51 2025-11-11 11:55:48.999999999 \n",
|
|
"52 2025-11-11 11:56:18.999999999 \n",
|
|
"53 2025-11-11 11:56:48.999999999 \n",
|
|
"54 2025-11-11 11:57:18.999999999 \n",
|
|
"55 2025-11-11 11:57:48.999999999 \n",
|
|
"56 2025-11-11 11:58:18.999999999 \n",
|
|
"57 2025-11-11 11:58:48.999999999 \n",
|
|
"58 2025-11-11 11:59:18.999999999 \n",
|
|
"59 2025-11-11 11:59:48.999999999 "
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"# drop rows of drift with timestamp in reference data but not in analysis data\n",
|
|
"drift_filtered = drift[drift['timestamp'].isin(data['timestamp'])]\n",
|
|
"display(drift_filtered)\n",
|
|
"\n",
|
|
"drift_filtered.to_csv(\"drift_filtered.csv\", index=False)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "70671022",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"ename": "ValueError",
|
|
"evalue": "Target column 'Square' not found in DataFrames",
|
|
"output_type": "error",
|
|
"traceback": [
|
|
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
|
|
"\u001b[31mValueError\u001b[39m Traceback (most recent call last)",
|
|
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[36]\u001b[39m\u001b[32m, line 6\u001b[39m\n\u001b[32m 3\u001b[39m \u001b[38;5;66;03m# rename column square to prediction\u001b[39;00m\n\u001b[32m 4\u001b[39m performance_reference.rename(columns={\u001b[33m'\u001b[39m\u001b[33mSquare\u001b[39m\u001b[33m'\u001b[39m: \u001b[33m'\u001b[39m\u001b[33mprediction\u001b[39m\u001b[33m'\u001b[39m}, inplace=\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[32m----> \u001b[39m\u001b[32m6\u001b[39m real_performance = \u001b[43mmodel\u001b[49m\u001b[43m.\u001b[49m\u001b[43mcalculate_performance\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 7\u001b[39m \u001b[43m \u001b[49m\u001b[43mreference_df\u001b[49m\u001b[43m=\u001b[49m\u001b[43mperformance_reference\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 8\u001b[39m \u001b[43m \u001b[49m\u001b[43manalysis_df\u001b[49m\u001b[43m=\u001b[49m\u001b[43mdata\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 9\u001b[39m \u001b[43m \u001b[49m\u001b[43mtarget_col\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtarget_col\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 10\u001b[39m \u001b[43m \u001b[49m\u001b[43mtimestamp_col\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtimestamp_col\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 11\u001b[39m \u001b[43m \u001b[49m\u001b[43mchunk_period\u001b[49m\u001b[43m=\u001b[49m\u001b[43mchunk_period\u001b[49m\n\u001b[32m 12\u001b[39m \u001b[43m)\u001b[49m\n\u001b[32m 14\u001b[39m metrics_df = model.get_calculated_metrics_dataframe(real_performance)\n\u001b[32m 15\u001b[39m display(metrics_df)\n",
|
|
"\u001b[36mFile \u001b[39m\u001b[32m~/Documents/projects/sientia/sientia-dataops-orchestrator_temporal/venv/lib/python3.11/site-packages/sientia/ModelAnalysis.py:397\u001b[39m, in \u001b[36mModelAnalysis.calculate_performance\u001b[39m\u001b[34m(self, reference_df, analysis_df, target_col, timestamp_col, metrics, chunk_period)\u001b[39m\n\u001b[32m 395\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(DATAFRAMES_EMPTY_ERROR)\n\u001b[32m 396\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m target_col \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m reference_df.columns \u001b[38;5;129;01mor\u001b[39;00m target_col \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m analysis_df.columns:\n\u001b[32m--> \u001b[39m\u001b[32m397\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mTarget column \u001b[39m\u001b[33m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mtarget_col\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m'\u001b[39m\u001b[33m not found in DataFrames\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 398\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m timestamp_col \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m reference_df.columns \u001b[38;5;129;01mor\u001b[39;00m timestamp_col \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m analysis_df.columns:\n\u001b[32m 399\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mTimestamp column \u001b[39m\u001b[33m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mtimestamp_col\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m'\u001b[39m\u001b[33m not found in DataFrames\u001b[39m\u001b[33m\"\u001b[39m)\n",
|
|
"\u001b[31mValueError\u001b[39m: Target column 'Square' not found in DataFrames"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"\n",
|
|
"real_performance = model.calculate_performance(\n",
|
|
" reference_df=data,\n",
|
|
" analysis_df=data,\n",
|
|
" target_col=target_col,\n",
|
|
" timestamp_col=timestamp_col,\n",
|
|
" chunk_period=chunk_period\n",
|
|
")\n",
|
|
"\n",
|
|
"metrics_df = model.get_calculated_metrics_dataframe(real_performance)\n",
|
|
"display(metrics_df)\n",
|
|
"\n",
|
|
"metrics_df.to_csv(\"metrics_df.csv\", index=False)"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "venv",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.11.13"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|