diff --git a/lintel/bin/Activate.ps1 b/lintel/bin/Activate.ps1 new file mode 100644 index 0000000..2fb3852 --- /dev/null +++ b/lintel/bin/Activate.ps1 @@ -0,0 +1,241 @@ +<# +.Synopsis +Activate a Python virtual environment for the current PowerShell session. + +.Description +Pushes the python executable for a virtual environment to the front of the +$Env:PATH environment variable and sets the prompt to signify that you are +in a Python virtual environment. Makes use of the command line switches as +well as the `pyvenv.cfg` file values present in the virtual environment. + +.Parameter VenvDir +Path to the directory that contains the virtual environment to activate. The +default value for this is the parent of the directory that the Activate.ps1 +script is located within. + +.Parameter Prompt +The prompt prefix to display when this virtual environment is activated. By +default, this prompt is the name of the virtual environment folder (VenvDir) +surrounded by parentheses and followed by a single space (ie. '(.venv) '). + +.Example +Activate.ps1 +Activates the Python virtual environment that contains the Activate.ps1 script. + +.Example +Activate.ps1 -Verbose +Activates the Python virtual environment that contains the Activate.ps1 script, +and shows extra information about the activation as it executes. + +.Example +Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv +Activates the Python virtual environment located in the specified location. + +.Example +Activate.ps1 -Prompt "MyPython" +Activates the Python virtual environment that contains the Activate.ps1 script, +and prefixes the current prompt with the specified string (surrounded in +parentheses) while the virtual environment is active. + +.Notes +On Windows, it may be required to enable this Activate.ps1 script by setting the +execution policy for the user. You can do this by issuing the following PowerShell +command: + +PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + +For more information on Execution Policies: +https://go.microsoft.com/fwlink/?LinkID=135170 + +#> +Param( + [Parameter(Mandatory = $false)] + [String] + $VenvDir, + [Parameter(Mandatory = $false)] + [String] + $Prompt +) + +<# Function declarations --------------------------------------------------- #> + +<# +.Synopsis +Remove all shell session elements added by the Activate script, including the +addition of the virtual environment's Python executable from the beginning of +the PATH variable. + +.Parameter NonDestructive +If present, do not remove this function from the global namespace for the +session. + +#> +function global:deactivate ([switch]$NonDestructive) { + # Revert to original values + + # The prior prompt: + if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { + Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt + Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT + } + + # The prior PYTHONHOME: + if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { + Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME + Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME + } + + # The prior PATH: + if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { + Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH + Remove-Item -Path Env:_OLD_VIRTUAL_PATH + } + + # Just remove the VIRTUAL_ENV altogether: + if (Test-Path -Path Env:VIRTUAL_ENV) { + Remove-Item -Path env:VIRTUAL_ENV + } + + # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: + if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { + Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force + } + + # Leave deactivate function in the global namespace if requested: + if (-not $NonDestructive) { + Remove-Item -Path function:deactivate + } +} + +<# +.Description +Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the +given folder, and returns them in a map. + +For each line in the pyvenv.cfg file, if that line can be parsed into exactly +two strings separated by `=` (with any amount of whitespace surrounding the =) +then it is considered a `key = value` line. The left hand string is the key, +the right hand is the value. + +If the value starts with a `'` or a `"` then the first and last character is +stripped from the value before being captured. + +.Parameter ConfigDir +Path to the directory that contains the `pyvenv.cfg` file. +#> +function Get-PyVenvConfig( + [String] + $ConfigDir +) { + Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" + + # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). + $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue + + # An empty map will be returned if no config file is found. + $pyvenvConfig = @{ } + + if ($pyvenvConfigPath) { + + Write-Verbose "File exists, parse `key = value` lines" + $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath + + $pyvenvConfigContent | ForEach-Object { + $keyval = $PSItem -split "\s*=\s*", 2 + if ($keyval[0] -and $keyval[1]) { + $val = $keyval[1] + + # Remove extraneous quotations around a string value. + if ("'""".Contains($val.Substring(0, 1))) { + $val = $val.Substring(1, $val.Length - 2) + } + + $pyvenvConfig[$keyval[0]] = $val + Write-Verbose "Adding Key: '$($keyval[0])'='$val'" + } + } + } + return $pyvenvConfig +} + + +<# Begin Activate script --------------------------------------------------- #> + +# Determine the containing directory of this script +$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition +$VenvExecDir = Get-Item -Path $VenvExecPath + +Write-Verbose "Activation script is located in path: '$VenvExecPath'" +Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" +Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" + +# Set values required in priority: CmdLine, ConfigFile, Default +# First, get the location of the virtual environment, it might not be +# VenvExecDir if specified on the command line. +if ($VenvDir) { + Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" +} +else { + Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." + $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") + Write-Verbose "VenvDir=$VenvDir" +} + +# Next, read the `pyvenv.cfg` file to determine any required value such +# as `prompt`. +$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir + +# Next, set the prompt from the command line, or the config file, or +# just use the name of the virtual environment folder. +if ($Prompt) { + Write-Verbose "Prompt specified as argument, using '$Prompt'" +} +else { + Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" + if ($pyvenvCfg -and $pyvenvCfg['prompt']) { + Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" + $Prompt = $pyvenvCfg['prompt']; + } + else { + Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virutal environment)" + Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" + $Prompt = Split-Path -Path $venvDir -Leaf + } +} + +Write-Verbose "Prompt = '$Prompt'" +Write-Verbose "VenvDir='$VenvDir'" + +# Deactivate any currently active virtual environment, but leave the +# deactivate function in place. +deactivate -nondestructive + +# Now set the environment variable VIRTUAL_ENV, used by many tools to determine +# that there is an activated venv. +$env:VIRTUAL_ENV = $VenvDir + +if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { + + Write-Verbose "Setting prompt to '$Prompt'" + + # Set the prompt to include the env name + # Make sure _OLD_VIRTUAL_PROMPT is global + function global:_OLD_VIRTUAL_PROMPT { "" } + Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT + New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt + + function global:prompt { + Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " + _OLD_VIRTUAL_PROMPT + } +} + +# Clear PYTHONHOME +if (Test-Path -Path Env:PYTHONHOME) { + Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME + Remove-Item -Path Env:PYTHONHOME +} + +# Add the venv to the PATH +Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH +$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/lintel/bin/activate b/lintel/bin/activate new file mode 100644 index 0000000..2a0eb40 --- /dev/null +++ b/lintel/bin/activate @@ -0,0 +1,76 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r + fi + + if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then + PS1="${_OLD_VIRTUAL_PS1:-}" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + if [ ! "${1:-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV="/Users/linhnguyen/lintel/lintel" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + if [ "x(lintel) " != x ] ; then + PS1="(lintel) ${PS1:-}" + else + if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then + # special case for Aspen magic directories + # see https://aspen.io/ + PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1" + else + PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1" + fi + fi + export PS1 +fi + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r +fi diff --git a/lintel/bin/activate.csh b/lintel/bin/activate.csh new file mode 100644 index 0000000..a2669a7 --- /dev/null +++ b/lintel/bin/activate.csh @@ -0,0 +1,37 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . +# Ported to Python 3.3 venv by Andrew Svetlov + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/Users/linhnguyen/lintel/lintel" + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/bin:$PATH" + + +set _OLD_VIRTUAL_PROMPT="$prompt" + +if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then + if ("lintel" != "") then + set env_name = "lintel" + else + if (`basename "VIRTUAL_ENV"` == "__") then + # special case for Aspen magic directories + # see https://aspen.io/ + set env_name = `basename \`dirname "$VIRTUAL_ENV"\`` + else + set env_name = `basename "$VIRTUAL_ENV"` + endif + endif + set prompt = "[$env_name] $prompt" + unset env_name +endif + +alias pydoc python -m pydoc + +rehash diff --git a/lintel/bin/activate.fish b/lintel/bin/activate.fish new file mode 100644 index 0000000..a532190 --- /dev/null +++ b/lintel/bin/activate.fish @@ -0,0 +1,75 @@ +# This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org) +# you cannot run it directly + +function deactivate -d "Exit virtualenv and return to normal shell environment" + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + functions -e fish_prompt + set -e _OLD_FISH_PROMPT_OVERRIDE + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + end + + set -e VIRTUAL_ENV + if test "$argv[1]" != "nondestructive" + # Self destruct! + functions -e deactivate + end +end + +# unset irrelevant variables +deactivate nondestructive + +set -gx VIRTUAL_ENV "/Users/linhnguyen/lintel/lintel" + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/bin" $PATH + +# unset PYTHONHOME if set +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # fish uses a function instead of an env var to generate the prompt. + + # save the current fish_prompt function as the function _old_fish_prompt + functions -c fish_prompt _old_fish_prompt + + # with the original prompt function renamed, we can override with our own. + function fish_prompt + # Save the return status of the last command + set -l old_status $status + + # Prompt override? + if test -n "(lintel) " + printf "%s%s" "(lintel) " (set_color normal) + else + # ...Otherwise, prepend env + set -l _checkbase (basename "$VIRTUAL_ENV") + if test $_checkbase = "__" + # special case for Aspen magic directories + # see https://aspen.io/ + printf "%s[%s]%s " (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal) + else + printf "%s(%s)%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal) + end + end + + # Restore the return status of the previous command. + echo "exit $old_status" | . + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" +end diff --git a/lintel/bin/pip b/lintel/bin/pip new file mode 100755 index 0000000..bbd18f1 --- /dev/null +++ b/lintel/bin/pip @@ -0,0 +1,8 @@ +#!/Users/linhnguyen/lintel/lintel/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/lintel/bin/pip3 b/lintel/bin/pip3 new file mode 100755 index 0000000..bbd18f1 --- /dev/null +++ b/lintel/bin/pip3 @@ -0,0 +1,8 @@ +#!/Users/linhnguyen/lintel/lintel/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/lintel/bin/pip3.8 b/lintel/bin/pip3.8 new file mode 100755 index 0000000..bbd18f1 --- /dev/null +++ b/lintel/bin/pip3.8 @@ -0,0 +1,8 @@ +#!/Users/linhnguyen/lintel/lintel/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/lintel/bin/python b/lintel/bin/python new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/lintel/bin/python @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/lintel/bin/python3 b/lintel/bin/python3 new file mode 120000 index 0000000..f894c65 --- /dev/null +++ b/lintel/bin/python3 @@ -0,0 +1 @@ +/opt/anaconda3/bin/python3 \ No newline at end of file diff --git a/lintel/pyvenv.cfg b/lintel/pyvenv.cfg new file mode 100644 index 0000000..2d4b7c0 --- /dev/null +++ b/lintel/pyvenv.cfg @@ -0,0 +1,3 @@ +home = /opt/anaconda3/bin +include-system-site-packages = false +version = 3.8.16 diff --git a/lintel/utils.py b/lintel/utils.py new file mode 100644 index 0000000..07f3721 --- /dev/null +++ b/lintel/utils.py @@ -0,0 +1,216 @@ +import openai +import numpy as np +from orion.evaluation.point import point_accuracy, point_f1_score +from collections import Counter + +with open("openai_api_key.txt", "r") as f: + api_key = f.read() + +def load_system_prompt(file_path): + with open(file_path) as f: + system_prompt = f.read() + return system_prompt + +GPT_model = "gpt-3.5-turbo" #"gpt-4" + +client = openai.Client(api_key=api_key) + +def get_model_response(message, gpt_model=GPT_model): + completion = client.chat.completions.create( + model=gpt_model, + messages=message, + ) + return completion.choices[0].message.content + +def create_message_zero_shot(seq_query, system_prompt_file='system_prompt_zero_shot.txt'): + messages = [] + + messages.append({"role": "system", "content":load_system_prompt(system_prompt_file)}) + + # final prompt + messages.append({"role": "user", "content": f"Sequence: {seq_query}"}) + return messages + + +def create_message_one_shot(seq_query, seq_ex, ano_ind_ex, system_prompt_file='system_prompt_one_shot.txt'): + messages = [] + + messages.append({"role": "system", "content":load_system_prompt(system_prompt_file)}) + + # one shot + messages.append({"role": "user", "content": f"Sequence: {seq_ex}"}) + messages.append({"role": "assistant", "content": ano_ind_ex}) + + # final prompt + messages.append({"role": "user", "content": f"Sequence: {seq_query}"}) + return messages + +def signal_to_str(sequence, start, stop, space = True, digit_round = 2): + """ + Truncate, round and turn the sequence into array of int, + then transform into string + + Args: + sequence (pandas series): signal + start (int): the start index + stop (int): the end index + space (bool, default True): True if want to add space between digits, False otherwise + digit_round (int, default 2): how many digits to round the sequence + Returns: + String of signal + """ + l_1 = (np.round(sequence.iloc[start:stop].value, digit_round)*(10**digit_round)).astype(int) + l_2 = l_1 - min(l_1) + res = '' + for s in l_2: + for d in str(s): + res += d + if space: + res += ' ' + res += ', ' + return res + +def indices_to_str(start, stop, space = True): + """ + Create a string of indices + + Args: + start (int): the start index + stop (int): the end index + space (bool, default True): True if want to add space between digits, False otherwise + Returns: + String of indices + """ + l = range(start, stop+1) + res = '' + for s in l: + for d in str(s): + res += d + if space: + res += ' ' + res += ', ' + return res + +def LLMresponse_to_list(answer, start, stop): + """ + Transform output from LLM into list of indices + + Args: + answer (str): LLM response + start (int): start index of truncated signal + stop (int): stop index of truncated signal + Returns: + List of anomalous indices corresponding to the original signal + """ + #Remove all characters from answer except the digits and , + ans = ''.join(i for i in answer if (i.isdigit() or i == ',')) + + #remove the extra comma at the end + if ans[-1] == ",": + ans = ans[:-1] + in_list = ans.split(",") + ind_list = [int(i) for i in in_list] + + #remove indices that exceed the length of signal + signal_length = stop - start + 1 + ind_list = [i for i in ind_list if i < signal_length] + + #convert index of the truncated list back to the index of original signal + ind_list = [i + start for i in ind_list] + + return ind_list + +def get_final_anomalous_list(res_list, threshold = 1): + """ + Get the final list of anomalous indices from multiple LLM responses + + Args: + res_list (list of list of int): list of lists of anomous indices output by LLM + threshold (int): how many votes an index need to have to be included in final list + Returns: + List of final anomalous indices + """ + combine_list = [i for l in res_list for i in l] + cnt = Counter(combine_list) + return [k for k, v in cnt.items() if v >= threshold] + +def indices_to_timestamp(sequence, ind_list): + """ + Transform list of indices into list of timestamp + + Args: + sequence (pandas series): signal + ind_list (list of int): list of indices + Returns: + List of timestamps + """ + return sequence.iloc[ind_list].timestamp.to_list() + +def evaluate(ground_truth, anomalies, start, end): + """ + Evaluate accuracy and f-1 score + + Args: + ground_truth (list of timestamps): true anomalies + anomalies (list of timestamps): detected anamalies + start (timestamp): start of signal + end (timestamp): end of signal + Returns: + Accuracy and F-1 score + """ + return {"accuracy": point_accuracy(ground_truth, anomalies, start=start, end=end), + "f-1 score": point_f1_score(ground_truth, anomalies, start=start, end=end)} + +def rolling_LLM_prediction(signal, size, step, create_message_func = create_message_zero_shot, + space = True, digit_round = 2, threshold = 1, num_iters = 1): + """ + Truncate the signal into rolling windows and get LLM response for each window + + Args: + signal (pandas series): signal to detect anomalies + size (int): size of rolling window + step (int): step of rolling + num_iters (int): number of iteration to run LLM model on each window + create_message_func (func): function to create message for LLM + Returns: + List of lists of anomalous indices + """ + combine_res = [] + + #Rolling windows truncate + for start in range(0, len(signal)-size, step): + stop = start + size + trunc_signal_str = signal_to_str(signal, start, stop, digit_round = digit_round, space = space) + m = create_message_func(trunc_signal_str) + + #Get num_iters anomaly predictions + window_ano = [] + for i in range(num_iters): + ans = get_model_response(m) + try: + l = LLMresponse_to_list(ans, start, stop) + except ValueError: + print(ans) + window_ano.append(l) + + #Get final anomaly prediction + final_ano = get_final_anomalous_list(window_ano, threshold = threshold) + + #Convert indices to timestamps + t = indices_to_timestamp(signal, final_ano) + combine_res.append(t) + return combine_res + +def rolling_filter_prediction(res, size, step): + """ + Get the final list of anomalous indices from results of rolling windows + + Args: + res (list of lists): result from rolling_LLM_prediction func + size + step + Returns: + List of anomalous indices of the entire sequence. + """ + raise NotImplementedError + diff --git a/system_prompt_one_shot.txt b/system_prompt_one_shot.txt new file mode 100644 index 0000000..d01c882 --- /dev/null +++ b/system_prompt_one_shot.txt @@ -0,0 +1 @@ +You are a helpful assistant that performs time series anomaly detection. The user will provide an example of a sequence and a list of indices that are anomalous. Then the user will provide sequence and you will be asked to give a list of indices that are anomalous in the sequence. The sequences are represented by decimal strings separated by commas. Please give a list of indices are anomalous in the following sequence without producing any additional text. Do not say anything like 'the anomalous indices in the sequence are', just return the numbers. \ No newline at end of file diff --git a/system_prompt_zero_shot.txt b/system_prompt_zero_shot.txt new file mode 100644 index 0000000..65b9823 --- /dev/null +++ b/system_prompt_zero_shot.txt @@ -0,0 +1 @@ +You are a helpful assistant that performs time series anomaly detection. The user will provide sequence and you will be asked to give a list of indices that are anomalous in the sequence. The sequences are represented by decimal strings separated by commas. Please give a list of indices are anomalous in the sequence without producing any additional text. Do not say anything like 'the anomalous indices in the sequence are', just return the numbers. \ No newline at end of file diff --git a/test.ipynb b/test.ipynb new file mode 100644 index 0000000..e5c115b --- /dev/null +++ b/test.ipynb @@ -0,0 +1,2696 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "c2d767fb", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from orion.data import load_signal, load_anomalies\n", + "from lintel import utils\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "92f18802", + "metadata": {}, + "outputs": [], + "source": [ + "e1_signal = load_signal('E-1')\n", + "e1_label = load_anomalies('E-1')\n", + "e7_signal = load_signal('E-7')\n", + "e7_label = load_anomalies('E-7')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "efbedc2f", + "metadata": {}, + "outputs": [], + "source": [ + "res = utils.rolling_LLM_prediction(e1_signal[:5000], 1000, 100)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "464bee86", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[1224936000,\n", + " 1224957600,\n", + " 1224979200,\n", + " 1225000800,\n", + " 1225022400,\n", + " 1225044000,\n", + " 1225065600,\n", + " 1225087200,\n", + " 1225108800,\n", + " 1225130400,\n", + " 1225152000,\n", + " 1225173600,\n", + " 1225195200,\n", + " 1225216800,\n", + " 1225238400,\n", + " 1225260000,\n", + " 1225281600,\n", + " 1225303200,\n", + " 1225324800,\n", + " 1225346400,\n", + " 1225368000,\n", + " 1225389600,\n", + " 1225411200,\n", + " 1225432800,\n", + " 1225454400,\n", + " 1225476000,\n", + " 1225497600,\n", + " 1225519200,\n", + " 1225540800,\n", + " 1225562400,\n", + " 1225584000,\n", + " 1225605600,\n", + " 1225627200,\n", + " 1225648800,\n", + " 1225670400,\n", + " 1225692000,\n", + " 1225713600,\n", + " 1225735200,\n", + " 1225756800,\n", + " 1225778400,\n", + " 1225800000,\n", + " 1225821600,\n", + " 1225843200,\n", + " 1225864800,\n", + " 1225886400,\n", + " 1225908000,\n", + " 1225929600,\n", + " 1225951200,\n", + " 1225972800,\n", + " 1225994400,\n", + " 1226016000,\n", + " 1226037600,\n", + " 1226059200,\n", + " 1226080800,\n", + " 1226102400,\n", + " 1226124000,\n", + " 1226145600,\n", + " 1226167200,\n", + " 1226188800,\n", + " 1226210400,\n", + " 1226232000,\n", + " 1226253600,\n", + " 1226275200,\n", + " 1226296800,\n", + " 1226318400,\n", + " 1226340000,\n", + " 1226361600,\n", + " 1226383200,\n", + " 1226404800],\n", + " [1224979200, 1229299200],\n", + " [1228003200,\n", + " 1228024800,\n", + " 1228046400,\n", + " 1228068000,\n", + " 1228089600,\n", + " 1228111200,\n", + " 1228132800,\n", + " 1228154400,\n", + " 1228176000,\n", + " 1228197600,\n", + " 1228219200,\n", + " 1228240800,\n", + " 1228262400,\n", + " 1228284000,\n", + " 1228305600,\n", + " 1228327200,\n", + " 1228348800,\n", + " 1228370400,\n", + " 1228392000,\n", + " 1228413600,\n", + " 1228435200,\n", + " 1228456800,\n", + " 1228478400,\n", + " 1228500000,\n", + " 1229385600,\n", + " 1229407200,\n", + " 1229428800,\n", + " 1229450400,\n", + " 1229472000,\n", + " 1229493600,\n", + " 1229515200,\n", + " 1229536800,\n", + " 1229558400,\n", + " 1229580000,\n", + " 1229601600,\n", + " 1229623200,\n", + " 1229644800,\n", + " 1229666400,\n", + " 1229688000,\n", + " 1229709600,\n", + " 1229731200,\n", + " 1229752800,\n", + " 1229774400,\n", + " 1229796000],\n", + " [1230336000,\n", + " 1230357600,\n", + " 1230379200,\n", + " 1230400800,\n", + " 1230422400,\n", + " 1230444000,\n", + " 1230465600,\n", + " 1230487200,\n", + " 1230508800,\n", + " 1230530400,\n", + " 1230552000,\n", + " 1230573600,\n", + " 1230595200],\n", + " [1231610400,\n", + " 1231912800,\n", + " 1232215200,\n", + " 1232517600,\n", + " 1232820000,\n", + " 1233122400,\n", + " 1233424800,\n", + " 1233727200,\n", + " 1234029600,\n", + " 1234332000,\n", + " 1234634400,\n", + " 1234936800,\n", + " 1235239200,\n", + " 1235541600,\n", + " 1235844000,\n", + " 1236146400,\n", + " 1236448800,\n", + " 1236751200,\n", + " 1237053600,\n", + " 1237356000,\n", + " 1237658400,\n", + " 1237960800,\n", + " 1238263200,\n", + " 1238565600,\n", + " 1238868000,\n", + " 1239170400,\n", + " 1239472800,\n", + " 1239775200,\n", + " 1240077600,\n", + " 1240380000,\n", + " 1240682400,\n", + " 1240984800],\n", + " [1235995200,\n", + " 1236016800,\n", + " 1236038400,\n", + " 1236060000,\n", + " 1236081600,\n", + " 1236103200,\n", + " 1236124800,\n", + " 1236146400,\n", + " 1236168000,\n", + " 1236189600,\n", + " 1236211200,\n", + " 1236232800,\n", + " 1236254400,\n", + " 1236276000,\n", + " 1236297600,\n", + " 1236319200,\n", + " 1236340800,\n", + " 1239321600,\n", + " 1239343200,\n", + " 1239364800,\n", + " 1239386400,\n", + " 1239408000,\n", + " 1239429600,\n", + " 1239451200,\n", + " 1239472800,\n", + " 1239494400,\n", + " 1239516000,\n", + " 1239537600,\n", + " 1239559200,\n", + " 1239580800,\n", + " 1239602400,\n", + " 1239624000,\n", + " 1239645600,\n", + " 1239667200,\n", + " 1239688800],\n", + " [1236168000,\n", + " 1236189600,\n", + " 1236211200,\n", + " 1236232800,\n", + " 1236254400,\n", + " 1236276000,\n", + " 1236297600,\n", + " 1236319200,\n", + " 1236340800,\n", + " 1236362400,\n", + " 1236384000,\n", + " 1236405600,\n", + " 1236427200,\n", + " 1236448800,\n", + " 1237464000,\n", + " 1237485600,\n", + " 1237507200,\n", + " 1237528800,\n", + " 1237550400,\n", + " 1237572000,\n", + " 1237593600,\n", + " 1237615200,\n", + " 1237636800,\n", + " 1237658400,\n", + " 1238760000,\n", + " 1238781600,\n", + " 1238803200,\n", + " 1238824800,\n", + " 1238846400,\n", + " 1238868000,\n", + " 1238889600,\n", + " 1238911200,\n", + " 1238932800,\n", + " 1238954400,\n", + " 1240056000,\n", + " 1240077600,\n", + " 1240099200,\n", + " 1240120800,\n", + " 1240142400,\n", + " 1240164000,\n", + " 1240185600,\n", + " 1240207200,\n", + " 1240228800,\n", + " 1240250400,\n", + " 1241352000,\n", + " 1241373600,\n", + " 1241395200,\n", + " 1241416800,\n", + " 1241438400,\n", + " 1241460000,\n", + " 1241481600,\n", + " 1241503200,\n", + " 1241524800,\n", + " 1241546400,\n", + " 1242648000],\n", + " [1238263200,\n", + " 1238284800,\n", + " 1238306400,\n", + " 1238328000,\n", + " 1238349600,\n", + " 1238371200,\n", + " 1238392800,\n", + " 1238414400,\n", + " 1238436000,\n", + " 1238457600,\n", + " 1238479200,\n", + " 1238500800,\n", + " 1238522400,\n", + " 1238544000,\n", + " 1238565600,\n", + " 1240401600,\n", + " 1240423200,\n", + " 1240444800,\n", + " 1240466400,\n", + " 1240488000,\n", + " 1240509600,\n", + " 1240531200,\n", + " 1240552800,\n", + " 1240574400,\n", + " 1240596000,\n", + " 1240617600,\n", + " 1240639200,\n", + " 1240660800,\n", + " 1240682400,\n", + " 1240704000,\n", + " 1242540000,\n", + " 1242561600,\n", + " 1242583200,\n", + " 1242604800,\n", + " 1242626400,\n", + " 1242648000,\n", + " 1242669600,\n", + " 1242691200,\n", + " 1242712800,\n", + " 1242734400,\n", + " 1242756000,\n", + " 1242777600,\n", + " 1242799200,\n", + " 1242820800,\n", + " 1242842400,\n", + " 1244678400,\n", + " 1244700000,\n", + " 1244721600,\n", + " 1244743200,\n", + " 1244764800,\n", + " 1244786400,\n", + " 1244808000],\n", + " [1240099200,\n", + " 1241006400,\n", + " 1241028000,\n", + " 1241049600,\n", + " 1241071200,\n", + " 1241092800,\n", + " 1242993600,\n", + " 1243015200,\n", + " 1243036800,\n", + " 1243058400,\n", + " 1243080000,\n", + " 1244980800,\n", + " 1245002400,\n", + " 1245024000,\n", + " 1245045600,\n", + " 1245067200,\n", + " 1246968000,\n", + " 1246989600,\n", + " 1247011200,\n", + " 1247032800,\n", + " 1247054400,\n", + " 1248955200,\n", + " 1248976800,\n", + " 1248998400,\n", + " 1249020000,\n", + " 1249041600,\n", + " 1250942400,\n", + " 1250964000,\n", + " 1250985600,\n", + " 1251007200,\n", + " 1251028800,\n", + " 1252929600,\n", + " 1252951200,\n", + " 1252972800,\n", + " 1252994400,\n", + " 1253016000,\n", + " 1254916800],\n", + " [1242453600,\n", + " 1242475200,\n", + " 1242496800,\n", + " 1242518400,\n", + " 1242540000,\n", + " 1242561600,\n", + " 1242583200,\n", + " 1242604800,\n", + " 1242626400,\n", + " 1242648000,\n", + " 1242669600,\n", + " 1244181600,\n", + " 1244203200],\n", + " [1248069600,\n", + " 1248091200,\n", + " 1248112800,\n", + " 1248134400,\n", + " 1248156000,\n", + " 1248177600,\n", + " 1248199200,\n", + " 1248220800,\n", + " 1248242400,\n", + " 1248264000,\n", + " 1248285600,\n", + " 1248307200],\n", + " [1246730400, 1247421600, 1247443200, 1247464800],\n", + " [1249473600,\n", + " 1249495200,\n", + " 1249516800,\n", + " 1249538400,\n", + " 1249884000,\n", + " 1249905600,\n", + " 1249927200,\n", + " 1249948800,\n", + " 1250294400,\n", + " 1250316000,\n", + " 1250337600,\n", + " 1250359200,\n", + " 1250704800,\n", + " 1250726400,\n", + " 1250748000,\n", + " 1250769600,\n", + " 1251115200,\n", + " 1251136800,\n", + " 1251158400,\n", + " 1251180000,\n", + " 1251525600,\n", + " 1251547200,\n", + " 1251568800],\n", + " [1251828000,\n", + " 1251849600,\n", + " 1251871200,\n", + " 1251892800,\n", + " 1251914400,\n", + " 1251936000,\n", + " 1251957600,\n", + " 1251979200,\n", + " 1252000800,\n", + " 1252022400,\n", + " 1252044000,\n", + " 1252065600,\n", + " 1252087200,\n", + " 1252108800,\n", + " 1252130400,\n", + " 1252152000,\n", + " 1252173600,\n", + " 1252195200,\n", + " 1252216800,\n", + " 1252238400,\n", + " 1252260000,\n", + " 1252281600,\n", + " 1252303200,\n", + " 1252324800,\n", + " 1252346400,\n", + " 1252368000,\n", + " 1252389600,\n", + " 1252411200,\n", + " 1252432800,\n", + " 1252454400,\n", + " 1252476000,\n", + " 1252497600,\n", + " 1252519200,\n", + " 1252540800,\n", + " 1252562400,\n", + " 1252584000,\n", + " 1252605600,\n", + " 1252627200,\n", + " 1252648800,\n", + " 1252670400,\n", + " 1252692000,\n", + " 1252713600,\n", + " 1252735200,\n", + " 1252756800,\n", + " 1252778400,\n", + " 1252800000,\n", + " 1252821600],\n", + " [1253059200,\n", + " 1253080800,\n", + " 1253102400,\n", + " 1253124000,\n", + " 1253145600,\n", + " 1253167200,\n", + " 1253188800,\n", + " 1253210400,\n", + " 1253232000,\n", + " 1253253600,\n", + " 1253275200,\n", + " 1253296800,\n", + " 1253318400,\n", + " 1253340000,\n", + " 1253361600,\n", + " 1253383200,\n", + " 1253404800,\n", + " 1253426400,\n", + " 1253448000,\n", + " 1253469600,\n", + " 1253491200,\n", + " 1253512800,\n", + " 1253534400,\n", + " 1253556000,\n", + " 1253577600,\n", + " 1253599200,\n", + " 1253620800,\n", + " 1253642400,\n", + " 1253664000,\n", + " 1253685600,\n", + " 1253707200,\n", + " 1253728800,\n", + " 1253750400,\n", + " 1253772000,\n", + " 1253793600,\n", + " 1253815200,\n", + " 1253836800,\n", + " 1253858400,\n", + " 1253880000,\n", + " 1253901600,\n", + " 1253923200,\n", + " 1253944800,\n", + " 1253966400,\n", + " 1253988000,\n", + " 1254009600],\n", + " [1255262400, 1255219200],\n", + " [1258869600,\n", + " 1258891200,\n", + " 1258912800,\n", + " 1258934400,\n", + " 1258956000,\n", + " 1258977600,\n", + " 1258999200,\n", + " 1259020800,\n", + " 1259042400,\n", + " 1259064000,\n", + " 1259085600,\n", + " 1259107200,\n", + " 1259128800,\n", + " 1259150400,\n", + " 1259172000,\n", + " 1259193600,\n", + " 1259215200,\n", + " 1259236800,\n", + " 1260856800,\n", + " 1260878400,\n", + " 1260900000,\n", + " 1260921600,\n", + " 1260943200,\n", + " 1260964800,\n", + " 1260986400,\n", + " 1261008000,\n", + " 1261029600,\n", + " 1262671200,\n", + " 1262692800,\n", + " 1262714400,\n", + " 1262736000,\n", + " 1262757600,\n", + " 1262779200,\n", + " 1262800800,\n", + " 1262822400,\n", + " 1262844000,\n", + " 1264485600,\n", + " 1264507200,\n", + " 1264528800,\n", + " 1264550400,\n", + " 1264572000,\n", + " 1264593600,\n", + " 1264615200,\n", + " 1264636800,\n", + " 1264658400,\n", + " 1266300000,\n", + " 1266321600,\n", + " 1266343200,\n", + " 1266364800,\n", + " 1266386400,\n", + " 1266408000,\n", + " 1266429600,\n", + " 1266451200,\n", + " 1266472800,\n", + " 1266494400,\n", + " 1268136000,\n", + " 1268157600,\n", + " 1268179200,\n", + " 1268200800,\n", + " 1268222400,\n", + " 1268244000,\n", + " 1268265600,\n", + " 1268287200],\n", + " [1259625600,\n", + " 1260165600,\n", + " 1260705600,\n", + " 1261958400,\n", + " 1262498400,\n", + " 1263038400,\n", + " 1263513600,\n", + " 1264053600,\n", + " 1264593600,\n", + " 1265133600],\n", + " [1261764000,\n", + " 1261785600,\n", + " 1261807200,\n", + " 1261828800,\n", + " 1261850400,\n", + " 1261872000,\n", + " 1261893600,\n", + " 1261915200,\n", + " 1261936800,\n", + " 1261958400,\n", + " 1261980000,\n", + " 1262001600,\n", + " 1262023200,\n", + " 1262044800,\n", + " 1262066400,\n", + " 1262088000,\n", + " 1262109600,\n", + " 1262131200,\n", + " 1262152800,\n", + " 1262174400,\n", + " 1262196000,\n", + " 1262217600,\n", + " 1262239200,\n", + " 1262260800,\n", + " 1262282400,\n", + " 1262304000,\n", + " 1262325600,\n", + " 1262347200,\n", + " 1262368800,\n", + " 1263470400,\n", + " 1263492000,\n", + " 1263513600,\n", + " 1263535200,\n", + " 1263556800,\n", + " 1263578400,\n", + " 1263600000,\n", + " 1263621600,\n", + " 1263643200,\n", + " 1263664800,\n", + " 1263686400,\n", + " 1263708000,\n", + " 1263729600,\n", + " 1263751200,\n", + " 1264852800,\n", + " 1264874400,\n", + " 1264896000,\n", + " 1264917600,\n", + " 1264939200,\n", + " 1264960800,\n", + " 1264982400,\n", + " 1265004000,\n", + " 1265025600,\n", + " 1265047200,\n", + " 1265068800,\n", + " 1265090400,\n", + " 1265112000,\n", + " 1265133600,\n", + " 1265155200,\n", + " 1266256800,\n", + " 1266278400,\n", + " 1266300000,\n", + " 1266321600,\n", + " 1266343200,\n", + " 1266364800,\n", + " 1266386400,\n", + " 1266408000,\n", + " 1266429600,\n", + " 1266451200,\n", + " 1266472800,\n", + " 1266494400,\n", + " 1266516000,\n", + " 1266537600,\n", + " 1267639200,\n", + " 1267660800,\n", + " 1267682400,\n", + " 1267704000,\n", + " 1267725600,\n", + " 1267747200,\n", + " 1267768800,\n", + " 1267790400,\n", + " 1267812000,\n", + " 1267833600,\n", + " 1267855200,\n", + " 1267876800,\n", + " 1268978400,\n", + " 1269000000,\n", + " 1269021600,\n", + " 1269043200,\n", + " 1269064800,\n", + " 1269086400,\n", + " 1269108000,\n", + " 1269129600,\n", + " 1269151200,\n", + " 1269172800,\n", + " 1270274400,\n", + " 1270296000,\n", + " 1270317600,\n", + " 1270339200,\n", + " 1270360800,\n", + " 1270382400],\n", + " [1264766400,\n", + " 1264788000,\n", + " 1264809600,\n", + " 1264831200,\n", + " 1264852800,\n", + " 1264874400,\n", + " 1264896000,\n", + " 1264917600,\n", + " 1264939200,\n", + " 1264960800,\n", + " 1264982400,\n", + " 1265004000,\n", + " 1265025600,\n", + " 1265047200,\n", + " 1265068800,\n", + " 1265090400,\n", + " 1265112000,\n", + " 1265133600,\n", + " 1265155200,\n", + " 1265176800,\n", + " 1265198400,\n", + " 1265220000,\n", + " 1265241600,\n", + " 1265263200,\n", + " 1265284800,\n", + " 1265306400,\n", + " 1265328000,\n", + " 1265349600,\n", + " 1265371200,\n", + " 1265392800,\n", + " 1265414400,\n", + " 1265436000,\n", + " 1265457600,\n", + " 1265479200,\n", + " 1265500800,\n", + " 1265522400,\n", + " 1265544000,\n", + " 1265565600,\n", + " 1265587200,\n", + " 1265608800,\n", + " 1265630400,\n", + " 1265652000,\n", + " 1265673600,\n", + " 1265695200,\n", + " 1265716800,\n", + " 1265738400,\n", + " 1265760000,\n", + " 1265781600,\n", + " 1265803200,\n", + " 1265824800,\n", + " 1265846400,\n", + " 1265868000,\n", + " 1265889600,\n", + " 1265911200,\n", + " 1265932800,\n", + " 1265954400,\n", + " 1265976000,\n", + " 1265997600,\n", + " 1266019200,\n", + " 1266040800,\n", + " 1266062400,\n", + " 1266084000,\n", + " 1266105600,\n", + " 1266127200,\n", + " 1266148800,\n", + " 1266170400,\n", + " 1266192000,\n", + " 1266213600,\n", + " 1266235200,\n", + " 1266256800,\n", + " 1266278400,\n", + " 1266300000,\n", + " 1266321600,\n", + " 1266343200,\n", + " 1266364800,\n", + " 1266386400,\n", + " 1266408000,\n", + " 1266429600,\n", + " 1266451200,\n", + " 1266472800,\n", + " 1266494400,\n", + " 1266516000,\n", + " 1266537600,\n", + " 1266559200,\n", + " 1266580800,\n", + " 1266602400,\n", + " 1266624000,\n", + " 1266645600,\n", + " 1266667200,\n", + " 1266688800,\n", + " 1266710400,\n", + " 1266732000,\n", + " 1266753600,\n", + " 1266775200,\n", + " 1266796800,\n", + " 1266818400,\n", + " 1266840000,\n", + " 1266861600],\n", + " [1266019200,\n", + " 1268438400,\n", + " 1268460000,\n", + " 1268481600,\n", + " 1268503200,\n", + " 1268524800,\n", + " 1268546400,\n", + " 1268568000,\n", + " 1268589600,\n", + " 1268611200,\n", + " 1268632800,\n", + " 1268654400,\n", + " 1268676000,\n", + " 1268697600,\n", + " 1268719200,\n", + " 1268740800,\n", + " 1268762400,\n", + " 1268784000,\n", + " 1268805600,\n", + " 1268827200,\n", + " 1268848800,\n", + " 1268870400,\n", + " 1268892000,\n", + " 1268913600,\n", + " 1268935200,\n", + " 1268956800,\n", + " 1268978400,\n", + " 1269000000,\n", + " 1269021600,\n", + " 1269043200,\n", + " 1269064800,\n", + " 1269086400,\n", + " 1269108000,\n", + " 1269129600,\n", + " 1269151200,\n", + " 1269172800,\n", + " 1269194400,\n", + " 1269216000,\n", + " 1269237600,\n", + " 1269259200,\n", + " 1269280800,\n", + " 1269302400,\n", + " 1269324000,\n", + " 1269345600,\n", + " 1269367200,\n", + " 1269388800,\n", + " 1269410400,\n", + " 1269432000,\n", + " 1269453600,\n", + " 1269475200,\n", + " 1269496800,\n", + " 1269518400,\n", + " 1269540000,\n", + " 1269561600,\n", + " 1269583200,\n", + " 1269604800,\n", + " 1269626400,\n", + " 1269648000,\n", + " 1269669600,\n", + " 1269691200,\n", + " 1269712800,\n", + " 1269734400,\n", + " 1269756000,\n", + " 1269777600,\n", + " 1269799200,\n", + " 1269820800,\n", + " 1269842400,\n", + " 1269864000,\n", + " 1269885600,\n", + " 1269907200,\n", + " 1269928800,\n", + " 1269950400,\n", + " 1269972000,\n", + " 1269993600,\n", + " 1270015200,\n", + " 1270036800,\n", + " 1270058400,\n", + " 1270080000,\n", + " 1270101600,\n", + " 1270123200,\n", + " 1270144800,\n", + " 1270166400,\n", + " 1270188000,\n", + " 1270209600,\n", + " 1270231200,\n", + " 1270252800,\n", + " 1270274400,\n", + " 1270296000,\n", + " 1270317600,\n", + " 1270339200,\n", + " 1270360800,\n", + " 1270382400,\n", + " 1270404000,\n", + " 1270425600,\n", + " 1270447200,\n", + " 1270468800,\n", + " 1270490400,\n", + " 1270512000,\n", + " 1270533600,\n", + " 1270555200,\n", + " 1270576800,\n", + " 1270598400,\n", + " 1270620000,\n", + " 1270641600,\n", + " 1270663200,\n", + " 1270684800,\n", + " 1270706400],\n", + " [1268589600,\n", + " 1268611200,\n", + " 1268632800,\n", + " 1268654400,\n", + " 1268676000,\n", + " 1268697600,\n", + " 1268719200,\n", + " 1268740800,\n", + " 1268762400,\n", + " 1268784000,\n", + " 1268805600,\n", + " 1268827200,\n", + " 1268848800,\n", + " 1268870400,\n", + " 1268892000,\n", + " 1268913600,\n", + " 1268935200,\n", + " 1268956800,\n", + " 1268978400,\n", + " 1269000000,\n", + " 1269021600,\n", + " 1269043200,\n", + " 1269064800,\n", + " 1269086400,\n", + " 1269108000,\n", + " 1269129600,\n", + " 1269151200,\n", + " 1269172800,\n", + " 1269194400,\n", + " 1269216000,\n", + " 1269237600,\n", + " 1269259200,\n", + " 1269280800,\n", + " 1269302400,\n", + " 1269324000,\n", + " 1269345600,\n", + " 1269367200,\n", + " 1269388800,\n", + " 1269410400,\n", + " 1269432000,\n", + " 1269453600,\n", + " 1269475200,\n", + " 1269496800,\n", + " 1269518400,\n", + " 1269540000,\n", + " 1269561600,\n", + " 1269583200,\n", + " 1269604800,\n", + " 1269626400,\n", + " 1269648000,\n", + " 1269669600,\n", + " 1269691200,\n", + " 1269712800,\n", + " 1269734400,\n", + " 1269756000,\n", + " 1269777600,\n", + " 1269799200,\n", + " 1269820800,\n", + " 1269842400,\n", + " 1269864000,\n", + " 1269885600,\n", + " 1269907200,\n", + " 1269928800,\n", + " 1269950400,\n", + " 1269972000,\n", + " 1269993600,\n", + " 1270015200,\n", + " 1270036800,\n", + " 1270058400,\n", + " 1270080000,\n", + " 1270101600,\n", + " 1270123200,\n", + " 1270144800,\n", + " 1270166400,\n", + " 1270188000,\n", + " 1270209600,\n", + " 1270231200,\n", + " 1270252800,\n", + " 1270274400,\n", + " 1270296000,\n", + " 1270317600,\n", + " 1270339200,\n", + " 1270360800,\n", + " 1270382400,\n", + " 1270404000,\n", + " 1270425600,\n", + " 1270447200,\n", + " 1270468800,\n", + " 1270490400,\n", + " 1270512000,\n", + " 1270533600,\n", + " 1270555200,\n", + " 1270576800,\n", + " 1270598400,\n", + " 1270620000,\n", + " 1270641600,\n", + " 1270663200,\n", + " 1270684800,\n", + " 1270706400,\n", + " 1270728000,\n", + " 1270749600,\n", + " 1270771200,\n", + " 1270792800,\n", + " 1270814400,\n", + " 1270836000,\n", + " 1270857600,\n", + " 1270879200,\n", + " 1270900800,\n", + " 1270922400,\n", + " 1270944000,\n", + " 1270965600,\n", + " 1270987200,\n", + " 1271008800,\n", + " 1271030400,\n", + " 1271052000,\n", + " 1271073600],\n", + " [1270468800,\n", + " 1270490400,\n", + " 1270512000,\n", + " 1270533600,\n", + " 1270555200,\n", + " 1270576800,\n", + " 1270598400,\n", + " 1270620000,\n", + " 1270641600,\n", + " 1270663200,\n", + " 1270684800,\n", + " 1270706400,\n", + " 1270728000,\n", + " 1270749600,\n", + " 1270771200,\n", + " 1270792800,\n", + " 1270814400,\n", + " 1270836000,\n", + " 1270857600,\n", + " 1270879200,\n", + " 1270900800,\n", + " 1270922400,\n", + " 1270944000,\n", + " 1270965600,\n", + " 1270987200,\n", + " 1271008800,\n", + " 1271030400,\n", + " 1271052000,\n", + " 1271073600,\n", + " 1271095200,\n", + " 1271116800,\n", + " 1271138400,\n", + " 1271160000,\n", + " 1271181600,\n", + " 1271203200,\n", + " 1271224800,\n", + " 1271246400,\n", + " 1271268000,\n", + " 1271289600,\n", + " 1271311200,\n", + " 1271332800,\n", + " 1271354400,\n", + " 1271376000,\n", + " 1271397600,\n", + " 1271419200,\n", + " 1271440800,\n", + " 1271462400,\n", + " 1271484000,\n", + " 1271505600,\n", + " 1271527200,\n", + " 1271548800,\n", + " 1271570400,\n", + " 1271592000,\n", + " 1271613600,\n", + " 1271635200,\n", + " 1271656800,\n", + " 1271678400,\n", + " 1271700000,\n", + " 1271721600,\n", + " 1271743200,\n", + " 1271764800,\n", + " 1271786400,\n", + " 1271808000,\n", + " 1271829600,\n", + " 1271851200,\n", + " 1271872800,\n", + " 1271894400,\n", + " 1271916000,\n", + " 1271937600,\n", + " 1271959200,\n", + " 1271980800,\n", + " 1272002400,\n", + " 1272024000,\n", + " 1272045600,\n", + " 1272067200,\n", + " 1272088800,\n", + " 1272110400,\n", + " 1272132000,\n", + " 1272153600,\n", + " 1272175200,\n", + " 1272196800,\n", + " 1272218400,\n", + " 1272240000,\n", + " 1272261600,\n", + " 1272283200,\n", + " 1272304800,\n", + " 1272326400,\n", + " 1272348000,\n", + " 1272369600,\n", + " 1272391200,\n", + " 1272412800,\n", + " 1272434400,\n", + " 1272456000,\n", + " 1272477600,\n", + " 1272499200,\n", + " 1272520800,\n", + " 1272542400,\n", + " 1272564000,\n", + " 1272585600,\n", + " 1272607200,\n", + " 1272628800,\n", + " 1272650400,\n", + " 1272672000,\n", + " 1272693600,\n", + " 1272715200,\n", + " 1272736800,\n", + " 1272758400,\n", + " 1272780000,\n", + " 1272801600,\n", + " 1272823200,\n", + " 1272844800,\n", + " 1272866400,\n", + " 1272888000,\n", + " 1272909600,\n", + " 1272931200,\n", + " 1272952800,\n", + " 1272974400,\n", + " 1272996000,\n", + " 1273017600,\n", + " 1273039200,\n", + " 1273060800],\n", + " [1272564000,\n", + " 1272607200,\n", + " 1272628800,\n", + " 1272650400,\n", + " 1272672000,\n", + " 1272693600,\n", + " 1272715200,\n", + " 1272736800,\n", + " 1272758400,\n", + " 1272780000,\n", + " 1272801600,\n", + " 1272823200,\n", + " 1272844800,\n", + " 1272866400,\n", + " 1272888000,\n", + " 1272909600,\n", + " 1272931200,\n", + " 1272952800,\n", + " 1272974400,\n", + " 1272996000,\n", + " 1273017600,\n", + " 1273039200,\n", + " 1273060800,\n", + " 1273082400,\n", + " 1273104000,\n", + " 1273125600,\n", + " 1273147200,\n", + " 1273168800,\n", + " 1273190400,\n", + " 1273212000,\n", + " 1273233600,\n", + " 1273255200,\n", + " 1273276800,\n", + " 1273298400,\n", + " 1273320000,\n", + " 1273341600,\n", + " 1273363200,\n", + " 1273384800,\n", + " 1273406400,\n", + " 1273428000,\n", + " 1273449600,\n", + " 1273471200,\n", + " 1273492800,\n", + " 1273514400,\n", + " 1273536000,\n", + " 1273557600,\n", + " 1273579200,\n", + " 1273600800,\n", + " 1273622400,\n", + " 1273644000,\n", + " 1273665600,\n", + " 1273687200,\n", + " 1273708800,\n", + " 1273730400,\n", + " 1273752000,\n", + " 1273773600,\n", + " 1273795200,\n", + " 1273816800,\n", + " 1273838400,\n", + " 1273860000,\n", + " 1273881600,\n", + " 1273903200,\n", + " 1273924800,\n", + " 1273946400,\n", + " 1273968000,\n", + " 1273989600,\n", + " 1274011200,\n", + " 1274032800,\n", + " 1274054400,\n", + " 1274076000,\n", + " 1274097600,\n", + " 1274119200,\n", + " 1274140800,\n", + " 1274162400,\n", + " 1274184000,\n", + " 1274205600,\n", + " 1274227200,\n", + " 1274248800,\n", + " 1274270400,\n", + " 1274292000,\n", + " 1274313600,\n", + " 1274702400,\n", + " 1274724000,\n", + " 1274745600,\n", + " 1274767200,\n", + " 1274788800,\n", + " 1274810400,\n", + " 1274832000,\n", + " 1274853600,\n", + " 1274875200,\n", + " 1274896800,\n", + " 1274918400,\n", + " 1274940000,\n", + " 1274961600,\n", + " 1274983200,\n", + " 1275004800,\n", + " 1275026400,\n", + " 1275048000,\n", + " 1275069600,\n", + " 1275091200,\n", + " 1275112800,\n", + " 1275134400,\n", + " 1275156000,\n", + " 1275177600,\n", + " 1275199200,\n", + " 1275220800,\n", + " 1275242400,\n", + " 1275264000,\n", + " 1275285600],\n", + " [1285437600,\n", + " 1285459200,\n", + " 1285480800,\n", + " 1285502400,\n", + " 1285524000,\n", + " 1285545600,\n", + " 1285567200,\n", + " 1285588800,\n", + " 1285610400,\n", + " 1285632000,\n", + " 1285653600,\n", + " 1285675200,\n", + " 1285696800,\n", + " 1285718400,\n", + " 1285740000,\n", + " 1285761600,\n", + " 1285783200,\n", + " 1285804800,\n", + " 1285826400,\n", + " 1285848000,\n", + " 1285869600,\n", + " 1285891200,\n", + " 1285912800,\n", + " 1285934400,\n", + " 1285956000,\n", + " 1285977600,\n", + " 1285999200,\n", + " 1286020800,\n", + " 1286042400,\n", + " 1286064000,\n", + " 1286085600,\n", + " 1286107200,\n", + " 1286128800,\n", + " 1286150400,\n", + " 1286172000,\n", + " 1286193600,\n", + " 1286215200,\n", + " 1286236800,\n", + " 1286258400,\n", + " 1286280000,\n", + " 1286301600,\n", + " 1286323200,\n", + " 1286344800,\n", + " 1286366400,\n", + " 1286388000,\n", + " 1286409600,\n", + " 1286431200,\n", + " 1286452800,\n", + " 1286474400,\n", + " 1286496000,\n", + " 1286517600,\n", + " 1286539200,\n", + " 1286560800,\n", + " 1286582400,\n", + " 1286604000,\n", + " 1286625600,\n", + " 1286647200,\n", + " 1286668800,\n", + " 1286690400,\n", + " 1286712000,\n", + " 1286733600,\n", + " 1286755200,\n", + " 1286776800,\n", + " 1286798400,\n", + " 1286820000,\n", + " 1286841600,\n", + " 1286863200,\n", + " 1286884800,\n", + " 1286906400,\n", + " 1286928000,\n", + " 1286949600,\n", + " 1286971200,\n", + " 1286992800,\n", + " 1287014400,\n", + " 1287036000,\n", + " 1287057600,\n", + " 1287079200,\n", + " 1287100800,\n", + " 1287122400,\n", + " 1287144000,\n", + " 1287165600,\n", + " 1287187200,\n", + " 1287208800,\n", + " 1287230400,\n", + " 1287252000,\n", + " 1287273600,\n", + " 1287295200,\n", + " 1287316800,\n", + " 1287338400],\n", + " [1285480800,\n", + " 1285502400,\n", + " 1285524000,\n", + " 1285545600,\n", + " 1285567200,\n", + " 1285588800,\n", + " 1285610400,\n", + " 1285632000,\n", + " 1285653600,\n", + " 1285675200,\n", + " 1285696800,\n", + " 1285718400,\n", + " 1285740000,\n", + " 1285761600,\n", + " 1285783200,\n", + " 1285804800,\n", + " 1286971200,\n", + " 1286992800,\n", + " 1287014400,\n", + " 1287036000,\n", + " 1287057600,\n", + " 1287079200,\n", + " 1287100800,\n", + " 1287122400,\n", + " 1287144000,\n", + " 1287165600,\n", + " 1287187200,\n", + " 1287208800,\n", + " 1287230400,\n", + " 1287252000,\n", + " 1287273600,\n", + " 1287295200,\n", + " 1288461600,\n", + " 1288483200,\n", + " 1288504800,\n", + " 1288526400,\n", + " 1288548000,\n", + " 1288569600,\n", + " 1288591200,\n", + " 1288612800,\n", + " 1288634400,\n", + " 1288656000,\n", + " 1288677600,\n", + " 1288699200,\n", + " 1288720800,\n", + " 1288742400,\n", + " 1288764000,\n", + " 1289930400,\n", + " 1289952000,\n", + " 1289973600,\n", + " 1289995200,\n", + " 1290016800,\n", + " 1290038400,\n", + " 1290060000,\n", + " 1290081600,\n", + " 1290103200,\n", + " 1290124800,\n", + " 1290146400,\n", + " 1290168000,\n", + " 1290189600,\n", + " 1290211200,\n", + " 1290232800,\n", + " 1291399200,\n", + " 1291420800,\n", + " 1291442400,\n", + " 1291464000,\n", + " 1291485600,\n", + " 1291507200,\n", + " 1291528800,\n", + " 1291550400,\n", + " 1291572000,\n", + " 1291593600,\n", + " 1291615200,\n", + " 1291636800,\n", + " 1291658400,\n", + " 1291680000,\n", + " 1291701600,\n", + " 1292868000,\n", + " 1292889600,\n", + " 1292911200,\n", + " 1292932800,\n", + " 1292954400,\n", + " 1292976000,\n", + " 1292997600,\n", + " 1293019200,\n", + " 1293040800,\n", + " 1293062400,\n", + " 1293084000,\n", + " 1293105600],\n", + " [1279195200,\n", + " 1284184800,\n", + " 1284206400,\n", + " 1284228000,\n", + " 1284249600,\n", + " 1284271200,\n", + " 1284292800,\n", + " 1284314400,\n", + " 1284336000,\n", + " 1284357600,\n", + " 1284379200,\n", + " 1284400800,\n", + " 1284422400,\n", + " 1284444000,\n", + " 1284465600,\n", + " 1284487200,\n", + " 1284508800,\n", + " 1284530400,\n", + " 1284552000,\n", + " 1284573600,\n", + " 1284595200,\n", + " 1284616800,\n", + " 1284638400,\n", + " 1284660000,\n", + " 1284681600,\n", + " 1284703200,\n", + " 1284724800,\n", + " 1284746400,\n", + " 1284768000,\n", + " 1284789600,\n", + " 1284811200,\n", + " 1284832800,\n", + " 1284854400,\n", + " 1284876000,\n", + " 1284897600,\n", + " 1284919200,\n", + " 1284940800,\n", + " 1284962400,\n", + " 1284984000,\n", + " 1285005600,\n", + " 1285027200,\n", + " 1285048800,\n", + " 1285070400,\n", + " 1285092000,\n", + " 1285113600,\n", + " 1285135200,\n", + " 1285156800,\n", + " 1285178400,\n", + " 1285200000,\n", + " 1285221600,\n", + " 1285243200,\n", + " 1285264800,\n", + " 1285286400,\n", + " 1285308000,\n", + " 1285329600,\n", + " 1285351200,\n", + " 1285372800,\n", + " 1285394400,\n", + " 1285416000,\n", + " 1285437600,\n", + " 1285459200,\n", + " 1285480800,\n", + " 1285502400,\n", + " 1285524000,\n", + " 1285545600,\n", + " 1285567200,\n", + " 1285588800,\n", + " 1285610400,\n", + " 1285632000],\n", + " [1281139200,\n", + " 1281160800,\n", + " 1281182400,\n", + " 1281204000,\n", + " 1281225600,\n", + " 1281247200,\n", + " 1281268800,\n", + " 1281290400,\n", + " 1281312000,\n", + " 1281333600,\n", + " 1281355200,\n", + " 1281376800,\n", + " 1281398400,\n", + " 1281420000,\n", + " 1281441600,\n", + " 1281463200,\n", + " 1281484800,\n", + " 1281506400,\n", + " 1281528000,\n", + " 1281549600,\n", + " 1281571200,\n", + " 1281592800,\n", + " 1281614400,\n", + " 1281636000,\n", + " 1281700800,\n", + " 1281722400,\n", + " 1281744000,\n", + " 1281765600,\n", + " 1281787200,\n", + " 1281808800,\n", + " 1281830400,\n", + " 1281852000],\n", + " [1283709600,\n", + " 1283731200,\n", + " 1283752800,\n", + " 1283774400,\n", + " 1283796000,\n", + " 1283817600,\n", + " 1283839200,\n", + " 1283860800,\n", + " 1283882400,\n", + " 1283904000,\n", + " 1283925600,\n", + " 1283947200,\n", + " 1283968800,\n", + " 1283990400,\n", + " 1284357600,\n", + " 1284379200,\n", + " 1284400800,\n", + " 1284422400,\n", + " 1284444000,\n", + " 1284465600,\n", + " 1284487200,\n", + " 1284508800,\n", + " 1284530400,\n", + " 1284552000,\n", + " 1284573600,\n", + " 1284595200,\n", + " 1284616800,\n", + " 1284638400,\n", + " 1285005600,\n", + " 1285027200,\n", + " 1285048800,\n", + " 1285070400,\n", + " 1285092000,\n", + " 1285113600,\n", + " 1285135200],\n", + " [1288634400],\n", + " [1288699200,\n", + " 1288720800,\n", + " 1288742400,\n", + " 1288764000,\n", + " 1288785600,\n", + " 1288807200,\n", + " 1288828800,\n", + " 1288850400,\n", + " 1288872000,\n", + " 1288893600,\n", + " 1288915200,\n", + " 1288936800,\n", + " 1288958400,\n", + " 1288980000,\n", + " 1289001600,\n", + " 1289023200,\n", + " 1289044800,\n", + " 1289066400,\n", + " 1289088000,\n", + " 1289109600,\n", + " 1289131200,\n", + " 1289152800,\n", + " 1289174400,\n", + " 1289196000,\n", + " 1289217600,\n", + " 1289239200,\n", + " 1289260800,\n", + " 1289282400,\n", + " 1289304000,\n", + " 1289325600,\n", + " 1289347200,\n", + " 1289368800,\n", + " 1289390400,\n", + " 1289412000,\n", + " 1289433600,\n", + " 1289455200,\n", + " 1289476800,\n", + " 1289498400,\n", + " 1289520000,\n", + " 1289541600,\n", + " 1289563200,\n", + " 1289584800,\n", + " 1289606400,\n", + " 1289628000,\n", + " 1289649600,\n", + " 1289671200,\n", + " 1289692800,\n", + " 1289714400,\n", + " 1289736000],\n", + " [1292371200,\n", + " 1292392800,\n", + " 1292414400,\n", + " 1292436000,\n", + " 1292457600,\n", + " 1292479200,\n", + " 1292500800,\n", + " 1292522400,\n", + " 1292544000,\n", + " 1292565600,\n", + " 1292587200,\n", + " 1292608800,\n", + " 1292630400,\n", + " 1292652000,\n", + " 1292673600,\n", + " 1292695200,\n", + " 1292716800,\n", + " 1292738400,\n", + " 1292760000,\n", + " 1292781600,\n", + " 1292803200,\n", + " 1292824800,\n", + " 1292846400,\n", + " 1292868000,\n", + " 1292889600,\n", + " 1292911200,\n", + " 1292932800,\n", + " 1292954400,\n", + " 1292976000,\n", + " 1292997600,\n", + " 1293019200,\n", + " 1293040800,\n", + " 1293062400,\n", + " 1293084000,\n", + " 1293105600,\n", + " 1293127200,\n", + " 1293148800,\n", + " 1293170400,\n", + " 1293192000,\n", + " 1293213600,\n", + " 1293235200,\n", + " 1293256800,\n", + " 1293278400,\n", + " 1293300000,\n", + " 1293321600,\n", + " 1293343200,\n", + " 1293364800,\n", + " 1293386400,\n", + " 1293408000,\n", + " 1293429600,\n", + " 1293451200,\n", + " 1293472800],\n", + " [1292047200,\n", + " 1292090400,\n", + " 1292263200,\n", + " 1292284800,\n", + " 1292306400,\n", + " 1292328000,\n", + " 1292349600,\n", + " 1292371200,\n", + " 1292392800,\n", + " 1292414400,\n", + " 1292436000,\n", + " 1292457600,\n", + " 1292479200,\n", + " 1292500800,\n", + " 1292522400,\n", + " 1292932800,\n", + " 1292954400,\n", + " 1292976000,\n", + " 1292997600,\n", + " 1293019200,\n", + " 1293040800,\n", + " 1293062400,\n", + " 1293084000,\n", + " 1293105600,\n", + " 1293127200,\n", + " 1293148800,\n", + " 1293170400,\n", + " 1293192000,\n", + " 1293213600,\n", + " 1293840000,\n", + " 1293861600,\n", + " 1293883200,\n", + " 1293904800,\n", + " 1293926400,\n", + " 1293948000,\n", + " 1293969600,\n", + " 1293991200,\n", + " 1294012800,\n", + " 1294034400,\n", + " 1294056000,\n", + " 1294077600,\n", + " 1294099200,\n", + " 1294120800,\n", + " 1294747200,\n", + " 1294768800,\n", + " 1294790400,\n", + " 1294812000,\n", + " 1294833600],\n", + " [1294509600,\n", + " 1294531200,\n", + " 1294552800,\n", + " 1294574400,\n", + " 1294596000,\n", + " 1294617600,\n", + " 1294639200,\n", + " 1294660800,\n", + " 1294682400,\n", + " 1294704000,\n", + " 1294725600,\n", + " 1294747200,\n", + " 1294768800,\n", + " 1294790400,\n", + " 1296691200,\n", + " 1296712800,\n", + " 1296734400,\n", + " 1296756000,\n", + " 1296777600,\n", + " 1296799200,\n", + " 1296820800,\n", + " 1296842400,\n", + " 1296864000,\n", + " 1296885600,\n", + " 1296907200,\n", + " 1296928800,\n", + " 1296950400,\n", + " 1296972000,\n", + " 1297382400,\n", + " 1297404000,\n", + " 1297425600,\n", + " 1297447200,\n", + " 1297468800,\n", + " 1297490400,\n", + " 1297512000,\n", + " 1297533600,\n", + " 1297555200,\n", + " 1297576800,\n", + " 1297598400,\n", + " 1297620000,\n", + " 1297641600,\n", + " 1297663200,\n", + " 1301486400,\n", + " 1301508000,\n", + " 1301529600,\n", + " 1301551200,\n", + " 1301572800,\n", + " 1301594400,\n", + " 1301616000,\n", + " 1301637600,\n", + " 1301659200,\n", + " 1301680800,\n", + " 1301702400,\n", + " 1301724000,\n", + " 1301745600,\n", + " 1301767200,\n", + " 1303948800,\n", + " 1303970400,\n", + " 1303992000,\n", + " 1304013600,\n", + " 1304035200,\n", + " 1304056800,\n", + " 1304078400,\n", + " 1304100000],\n", + " [1296280800,\n", + " 1296302400,\n", + " 1296324000,\n", + " 1296345600,\n", + " 1296367200,\n", + " 1296388800,\n", + " 1296410400,\n", + " 1296432000,\n", + " 1296453600,\n", + " 1296475200,\n", + " 1296496800,\n", + " 1296518400,\n", + " 1296540000,\n", + " 1296561600,\n", + " 1296583200,\n", + " 1296604800,\n", + " 1296626400,\n", + " 1296648000,\n", + " 1296669600,\n", + " 1296691200,\n", + " 1296712800,\n", + " 1296734400,\n", + " 1296756000,\n", + " 1296777600,\n", + " 1296799200,\n", + " 1296820800,\n", + " 1296842400,\n", + " 1296864000,\n", + " 1296885600,\n", + " 1296907200,\n", + " 1296928800,\n", + " 1296950400,\n", + " 1296972000,\n", + " 1296993600,\n", + " 1297015200,\n", + " 1297036800,\n", + " 1297058400,\n", + " 1297080000,\n", + " 1297101600,\n", + " 1297123200,\n", + " 1297144800,\n", + " 1297166400,\n", + " 1297188000,\n", + " 1297209600,\n", + " 1297231200,\n", + " 1297252800,\n", + " 1297274400,\n", + " 1297296000,\n", + " 1297317600,\n", + " 1297339200,\n", + " 1297360800,\n", + " 1297382400,\n", + " 1297404000,\n", + " 1297425600,\n", + " 1297447200,\n", + " 1297468800,\n", + " 1297490400,\n", + " 1297512000,\n", + " 1297533600,\n", + " 1297555200,\n", + " 1297576800,\n", + " 1297598400,\n", + " 1297620000,\n", + " 1297641600,\n", + " 1297663200,\n", + " 1297684800,\n", + " 1297706400,\n", + " 1297728000,\n", + " 1297749600,\n", + " 1297771200,\n", + " 1297792800,\n", + " 1297814400,\n", + " 1297836000],\n", + " [1300255200,\n", + " 1300276800,\n", + " 1300298400,\n", + " 1300320000,\n", + " 1300341600,\n", + " 1300363200,\n", + " 1300384800,\n", + " 1300406400,\n", + " 1300428000,\n", + " 1300449600,\n", + " 1300471200,\n", + " 1300492800,\n", + " 1300514400,\n", + " 1300536000,\n", + " 1300557600,\n", + " 1300579200,\n", + " 1300600800,\n", + " 1300622400,\n", + " 1300644000,\n", + " 1300665600,\n", + " 1300687200,\n", + " 1300708800,\n", + " 1300730400,\n", + " 1300752000,\n", + " 1300773600,\n", + " 1300795200,\n", + " 1300816800,\n", + " 1300838400,\n", + " 1300860000,\n", + " 1300881600,\n", + " 1300903200,\n", + " 1300924800,\n", + " 1300946400,\n", + " 1300968000,\n", + " 1300989600,\n", + " 1301011200,\n", + " 1301032800,\n", + " 1301054400,\n", + " 1301076000,\n", + " 1301097600,\n", + " 1301119200,\n", + " 1301140800,\n", + " 1301162400,\n", + " 1301184000,\n", + " 1301205600,\n", + " 1301227200,\n", + " 1301248800,\n", + " 1301270400,\n", + " 1301292000,\n", + " 1301313600,\n", + " 1301335200,\n", + " 1301356800,\n", + " 1301378400,\n", + " 1301400000,\n", + " 1301421600,\n", + " 1301443200,\n", + " 1301464800,\n", + " 1301486400,\n", + " 1301508000,\n", + " 1301529600,\n", + " 1301551200,\n", + " 1301572800,\n", + " 1301594400,\n", + " 1301616000,\n", + " 1301637600,\n", + " 1301659200,\n", + " 1301680800,\n", + " 1301702400,\n", + " 1301724000,\n", + " 1301745600,\n", + " 1301767200,\n", + " 1301788800,\n", + " 1301810400,\n", + " 1301832000,\n", + " 1301853600],\n", + " [1300730400,\n", + " 1300752000,\n", + " 1300773600,\n", + " 1300795200,\n", + " 1300816800,\n", + " 1300838400,\n", + " 1300860000,\n", + " 1300881600,\n", + " 1300903200,\n", + " 1300924800,\n", + " 1300946400,\n", + " 1300968000,\n", + " 1300989600,\n", + " 1301011200,\n", + " 1301032800,\n", + " 1301054400,\n", + " 1301076000,\n", + " 1302393600,\n", + " 1302415200,\n", + " 1302436800,\n", + " 1302458400,\n", + " 1302480000,\n", + " 1302501600,\n", + " 1302523200,\n", + " 1302544800,\n", + " 1302566400,\n", + " 1302588000,\n", + " 1302609600,\n", + " 1302631200,\n", + " 1302652800,\n", + " 1302674400,\n", + " 1302696000,\n", + " 1302717600,\n", + " 1304035200,\n", + " 1304056800,\n", + " 1304078400,\n", + " 1304100000,\n", + " 1304121600,\n", + " 1304143200,\n", + " 1304164800,\n", + " 1304186400,\n", + " 1304208000,\n", + " 1304229600,\n", + " 1304251200,\n", + " 1304272800,\n", + " 1304294400,\n", + " 1304316000,\n", + " 1304337600,\n", + " 1304359200,\n", + " 1307836800,\n", + " 1307858400,\n", + " 1307880000,\n", + " 1307901600,\n", + " 1307923200,\n", + " 1307944800,\n", + " 1307966400,\n", + " 1307988000,\n", + " 1308009600,\n", + " 1308031200,\n", + " 1308052800,\n", + " 1308074400,\n", + " 1308096000,\n", + " 1308117600,\n", + " 1308139200,\n", + " 1308160800],\n", + " [1302782400,\n", + " 1302847200,\n", + " 1304532000,\n", + " 1304596800,\n", + " 1306389600,\n", + " 1306454400,\n", + " 1308247200,\n", + " 1308312000,\n", + " 1310104800,\n", + " 1310169600,\n", + " 1311962400,\n", + " 1312027200,\n", + " 1313820000,\n", + " 1313884800,\n", + " 1315677600,\n", + " 1315742400,\n", + " 1317535200,\n", + " 1317600000,\n", + " 1319392800,\n", + " 1319457600,\n", + " 1321250400,\n", + " 1321315200,\n", + " 1323108000,\n", + " 1323172800],\n", + " [1306346400,\n", + " 1306368000,\n", + " 1306389600,\n", + " 1306411200,\n", + " 1306432800,\n", + " 1306454400,\n", + " 1306476000,\n", + " 1306497600,\n", + " 1306519200,\n", + " 1306540800,\n", + " 1306562400,\n", + " 1306584000,\n", + " 1306605600,\n", + " 1306627200,\n", + " 1306648800,\n", + " 1306670400,\n", + " 1306692000,\n", + " 1307728800,\n", + " 1307750400,\n", + " 1307772000,\n", + " 1307793600,\n", + " 1307815200,\n", + " 1307836800,\n", + " 1307858400,\n", + " 1307880000,\n", + " 1307901600,\n", + " 1307923200,\n", + " 1307944800,\n", + " 1307966400,\n", + " 1307988000,\n", + " 1308009600,\n", + " 1309046400,\n", + " 1309068000,\n", + " 1309089600,\n", + " 1309111200,\n", + " 1309132800,\n", + " 1309154400,\n", + " 1309176000,\n", + " 1309197600,\n", + " 1309219200,\n", + " 1309240800,\n", + " 1309262400,\n", + " 1309284000,\n", + " 1310320800,\n", + " 1310342400,\n", + " 1310364000,\n", + " 1310385600,\n", + " 1310407200,\n", + " 1310428800,\n", + " 1310450400,\n", + " 1310472000,\n", + " 1311508800,\n", + " 1311530400,\n", + " 1311552000,\n", + " 1311573600,\n", + " 1312610400,\n", + " 1312632000,\n", + " 1312653600,\n", + " 1313690400,\n", + " 1313712000,\n", + " 1313733600,\n", + " 1314770400,\n", + " 1314792000,\n", + " 1314813600],\n", + " [1319911200,\n", + " 1319932800,\n", + " 1319954400,\n", + " 1319976000,\n", + " 1319997600,\n", + " 1320019200,\n", + " 1320040800,\n", + " 1320062400,\n", + " 1320084000,\n", + " 1320105600,\n", + " 1320127200,\n", + " 1320148800,\n", + " 1320170400,\n", + " 1320192000,\n", + " 1320213600]]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "bd89ba70", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiwAAAGvCAYAAAB4u44CAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAABBkElEQVR4nO3deXxV9Z3/8fe92UN2liyIEgIlUCCJQJlYslioFJAH6rSDrYhQoYPC/AQ6WGjdrYLKooNUqShBGnEbWSZalAm9FzOmlCVRgbCnQkMW0JCVrPf8/ki5eiUBspmT5PV8PO4D7jnf8z2f8+Vw887ZrsUwDEMAAAAmZu3oAgAAAK6GwAIAAEyPwAIAAEyPwAIAAEyPwAIAAEyPwAIAAEyPwAIAAEyPwAIAAEzPvaMLaCsOh0Nnz56Vv7+/LBZLR5cDAACugWEYKisrU0REhKzWpo+jdJnAcvbsWfXr16+jywAAAC1w5swZXXfddU3O7zKBxd/fX1LDBgcEBLRJn5U1dfrBU+mSpL/9bpx8PTtwuGoqpJWDG/7+66OSZ48OK6WytlI/eudHkqRdP9slXw/fDqnDUVmp4wmJkqRBH++W1bdj6gDQOnzWXs4sn7NS+3/WlpaWql+/fs6f403pMoHl0mmggICANgss7jV1snr5Ovvt2P9EbpLXP091BQR0aGBxr3WXm4/bP0sJ6LjA4u4uP7ev6yCwAJ0Tn7WXM8vnrPTdfdZe7XIOLroFAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACm1+zAsnv3bk2ZMkURERGyWCzaunXrVZex2Wy68cYb5eXlpYEDByolJaXJtsuXL5fFYtGCBQuaWxoAAOiimh1YKioqFBMTo7Vr115T+9zcXE2ePFk333yzsrOztWDBAs2ePVsffvjhZW337t2rdevWacSIEc0tCwAAdGHuzV1g4sSJmjhx4jW3f/nllxUZGamVK1dKkoYMGaKMjAytXr1aEyZMcLYrLy/XXXfdpVdeeUW///3vm1sWAADowtr9GpbMzEyNHz/eZdqECROUmZnpMm3evHmaPHnyZW2bUl1drdLSUpcXAADompp9hKW5CgoKFBoa6jItNDRUpaWlunjxonx8fPTmm2/qwIED2rt37zX3u2zZMj3++ONtXS4AADChDr9L6MyZM3rggQeUmpoqb2/va15u6dKlKikpcb7OnDnTjlUCAICO1O5HWMLCwlRYWOgyrbCwUAEBAfLx8dH+/ftVVFSkG2+80Tm/vr5eu3fv1osvvqjq6mq5ubld1q+Xl5e8vLzau3wAAGAC7R5Y4uPj9cEHH7hM27lzp+Lj4yVJ48aN0+eff+4yf9asWYqOjtZvfvObRsMKAADoXpodWMrLy3XixAnn+9zcXGVnZyskJETXX3+9li5dqry8PL3++uuSpLlz5+rFF1/Ugw8+qF/+8pfatWuX3n77bb3//vuSJH9/fw0bNsxlHT169FDPnj0vmw4AALqnZl/Dsm/fPsXFxSkuLk6StGjRIsXFxemRRx6RJOXn5+v06dPO9pGRkXr//fe1c+dOxcTEaOXKlVq/fr3LLc0AAABX0uwjLMnJyTIMo8n5jT3FNjk5WVlZWde8DpvN1tyyAABAF9bhdwkBAABcDYEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYHoEFAACYXrMDy+7duzVlyhRF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AgAATI/AAgAAmrR7925NmTJFERERslgs2rp1a7P7ePvttxUbGytfX1/dcMMNeu6555rdB4EFAAA0qaKiQjExMVq7dm2Llv/zn/+su+66S3PnztXBgwf1hz/8QatXr9aLL77YrH540i0AALgmFotFW7Zs0W233eacVl1drd/97nfavHmzLly4oGHDhumZZ55RcnKyJOkXv/iFamtr9c477ziXWbNmjZ599lmdPn1aFovlmtbNERYAANBi8+fPV2Zmpt5880199tln+tnPfqaf/OQnOn78uKSGQOPt7e2yjI+Pj/7xj3/oiy++uOb1EFgAAECLnD59Whs2bNA777yjhIQERUVF6T//8z81duxYbdiwQZI0YcIEvffee0pPT5fD4dCxY8e0cuVKSVJ+fv41r8u9XbYAAAB0eZ9//rnq6+v1ve99z2V6dXW1evbsKUmaM2eOTp48qVtvvVW1tbUKCAjQAw88oMcee0xW67UfNyGwAACAFikvL5ebm5v2798vNzc3l3l+fn6SGq57eeaZZ/T000+roKBAvXv3Vnp6uiRpwIAB17wuAgsAAGiRuLg41dfXq6ioSAkJCVds6+bmpr59+0qSNm/erPj4ePXu3fua10VgAQAATSovL9eJEyec73Nzc5Wdna2QkBB973vf01133aUZM2Zo5cqViouL07lz55Senq4RI0Zo8uTJOn/+vN59910lJyerqqrKec2L3W5vVh3c1gwAAJpks9l08803Xzb9nnvuUUpKimpra/X73/9er7/+uvLy8tSrVy/9y7/8ix5//HENHz5c58+f15QpU/T555/LMAzFx8frqaee0pgxY5pVB4EFAACYHrc1AwAA0yOwAAAA0yOwAAAA0yOwAAAA0yOwAAAA0yOwAAAA0yOwAAAA0yOwAAAA0yOwAAAA0yOwAAAA0yOwAAAA0yOwAAAA0/v/h6UeQc0OMMMAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.axvline(x = e1_signal.iloc[0].timestamp, color = 'C0')\n", + "plt.axvline(x = e1_signal.iloc[999].timestamp, color = 'C0')\n", + "\n", + "plt.axvline(x = e1_signal.iloc[100].timestamp, color = 'C1')\n", + "plt.axvline(x = e1_signal.iloc[100+999].timestamp, color = 'C1')\n", + "\n", + "plt.axvline(x = e1_signal.iloc[200].timestamp, color = 'C2')\n", + "plt.axvline(x = e1_signal.iloc[200+999].timestamp, color = 'C2')\n", + "\n", + "plt.axvline(x = e1_signal.iloc[300].timestamp, color = 'C3')\n", + "plt.axvline(x = e1_signal.iloc[300+999].timestamp, color = 'C3')\n", + "\n", + "for i, r in enumerate(res[:4]):\n", + " plt.scatter(r, [1 for i in range(len(r))], alpha = 0.5, label = 'window ' + str(i))\n", + "plt.legend()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fb190660", + "metadata": {}, + "outputs": [], + "source": [ + "print(e1_signal[(e1_signal.timestamp >= e1_label.start[0]) & (e1_signal.timestamp <= e1_label.end[0])].index[0])\n", + "print(e1_signal[(e1_signal.timestamp >= e1_label.start[0]) & (e1_signal.timestamp <= e1_label.end[0])].index[-1])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a03072b5", + "metadata": {}, + "outputs": [], + "source": [ + "print(e7_signal[(e7_signal.timestamp >= e7_label.start[0]) & (e7_signal.timestamp <= e7_label.end[0])].index[0])\n", + "print(e7_signal[(e7_signal.timestamp >= e7_label.start[0]) & (e7_signal.timestamp <= e7_label.end[0])].index[-1])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f9f62300", + "metadata": {}, + "outputs": [], + "source": [ + "e7 = utils.signal_to_str(e7_signal, 7900, 8600)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cfe2ba58", + "metadata": {}, + "outputs": [], + "source": [ + "e7_ano_ind = utils.indices_to_str(8163-7900, 8443-7900)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f6595873", + "metadata": {}, + "outputs": [], + "source": [ + "e1 = utils.signal_to_str(e1_signal, 7400, 8300)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "56d1e05e", + "metadata": {}, + "outputs": [], + "source": [ + "e1_ano_ind = utils.indices_to_str(7880-7400, 7910-7400)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c64dc0e7", + "metadata": {}, + "outputs": [], + "source": [ + "#m = utils.create_message_one_shot(e1, e7, e7_ano_ind)\n", + "m = utils.create_message_zero_shot(e1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "176b2765", + "metadata": {}, + "outputs": [], + "source": [ + "m" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1f811f3b", + "metadata": {}, + "outputs": [], + "source": [ + "ans = utils.get_model_response(m)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea16518a", + "metadata": {}, + "outputs": [], + "source": [ + "ans" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b2b29c3a", + "metadata": {}, + "outputs": [], + "source": [ + "l = utils.LLMresponse_to_list(ans, 7400, 8300)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11a65eb7", + "metadata": {}, + "outputs": [], + "source": [ + "t = utils.indices_to_timestamp(e1_signal, l)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dc268ae6", + "metadata": {}, + "outputs": [], + "source": [ + "e1_signal.iloc[7500].timestamp" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "287dcced", + "metadata": {}, + "outputs": [], + "source": [ + "res = utils.evaluate([i for i in range(e1_label.start[0], e1_label.end[0] + 1)], t, int(e1_signal.iloc[7400].timestamp), int(e1_signal.iloc[8300].timestamp))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23a39cbe", + "metadata": {}, + "outputs": [], + "source": [ + "res" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "961105e3", + "metadata": {}, + "outputs": [], + "source": [ + "e1_signal.iloc[l]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6cd06742", + "metadata": {}, + "outputs": [], + "source": [ + "plt.plot(e1_signal.iloc[7400:8301]['timestamp'], e1_signal.iloc[7400:8301]['value'])\n", + "plt.axvline(x = e1_label.start[0], color = 'k', linestyle = \"--\")\n", + "plt.axvline(x = e1_label.end[0], color = 'k', linestyle = \"--\")\n", + "plt.scatter(t, e1_signal.iloc[l].value, color = 'C2', label = \"zero-shot\")\n", + "# plt.scatter(l_2.iloc[GPT_res].index,l_2.iloc[GPT_res].values, color = 'C1', label = \"one-shot\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d086651b", + "metadata": {}, + "outputs": [], + "source": [ + "len(e1_signal)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6c1128e5", + "metadata": {}, + "outputs": [], + "source": [ + "e1_signal.index[-1]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1cdde19f", + "metadata": {}, + "outputs": [], + "source": [ + "e1_signal = e1_signal[:5000]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c395fb54", + "metadata": {}, + "outputs": [], + "source": [ + "#For rolling windows\n", + "size = 1000\n", + "step = 100\n", + "combine_res = []\n", + "for start in range(0, len(e1_signal)-size, step): \n", + " stop = start + size\n", + " trunc_signal_str = utils.signal_to_str(e1_signal, start, stop)\n", + " m = utils.create_message_zero_shot(trunc_signal_str)\n", + " ans = utils.get_model_response(m)\n", + " try:\n", + " l = utils.LLMresponse_to_list(ans, start, stop)\n", + " except ValueError: \n", + " print(ans)\n", + " t = utils.indices_to_timestamp(e1_signal, l)\n", + " combine_res.append(t)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9911c2d0", + "metadata": {}, + "outputs": [], + "source": [ + "len(combine_res)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f67b7047", + "metadata": {}, + "outputs": [], + "source": [ + "#plt.scatter(e1_signal[:5000]['timestamp'], [1 for i in range(5000)], color = 'grey', alpha = 0.1)\n", + "for res in combine_res[:3]:\n", + " plt.scatter(res, [1 for i in range(len(res))], alpha = 0.5)\n", + "#plt.scatter(combine_res[1], [1 for i in range(len(combine_res[1]))], alpha = 0.2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6326a854", + "metadata": {}, + "outputs": [], + "source": [ + "combine_res[3][-1] - combine_res[3][0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b0e2067a", + "metadata": {}, + "outputs": [], + "source": [ + "plt.plot(e1_signal.iloc[7400:8300].index, e1_signal.iloc[7400:8300].value)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10ad5ad6", + "metadata": {}, + "outputs": [], + "source": [ + "plt.plot(e1_signal.iloc[7400:8300].timestamp, e1_signal.iloc[7400:8300].value)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d6e93709", + "metadata": {}, + "outputs": [], + "source": [ + "e1_signal" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16e6dfb0", + "metadata": {}, + "outputs": [], + "source": [ + "utils.LLMresponse_to_list(\"6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378,\", 0, 500)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1b0a7853", + "metadata": {}, + "outputs": [], + "source": [ + "answer = \"6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378,\"\n", + "#remove space between digits\n", + "ans = answer.replace(\" \", \"\")\n", + "#remove square brackets\n", + "ans = ans.replace(\"[\", \"\")\n", + "ans = ans.replace(\"]\", \"\")\n", + "#remove the extra comma at the end\n", + "if ans[-1] == \",\": \n", + " ans = ans[:-1]\n", + "in_list = ans.split(\",\")\n", + "ind_list = [int(i) for i in in_list]\n", + "\n", + "#remove indices that exceed the length of signal\n", + "signal_length = stop - start + 1\n", + "ind_list = [i for i in ind_list if i < signal_length]\n", + "\n", + "#convert index of the truncated list back to the index of original signal \n", + "ind_list = [i + start for i in ind_list]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69daade9", + "metadata": {}, + "outputs": [], + "source": [ + "def avg_predicted_prob(message_fn, seq_query, seq_ex, ano_ind_ex, system_prompt_file='system_prompt.txt', max_iter = 5):\n", + " m = message_fn(seq_query, seq_ex, ano_ind_ex, system_prompt_file='system_prompt.txt')\n", + " seq = create_list_ind(seq_query)\n", + " predicted = [0 for i in range(len(seq))]\n", + " for _ in range(max_iter):\n", + " ans = get_model_response(m)\n", + " try:\n", + " ans_list = create_list_ind(ans)\n", + " except: \n", + " continue\n", + " for i in ans_list: \n", + " try:\n", + " predicted[i] += 1/max_iter\n", + " except: \n", + " #More specific error\n", + " pass\n", + " return predicted\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8ee87c7d", + "metadata": {}, + "outputs": [], + "source": [ + "pred = avg_predicted_prob(get_message_zero_shot, e1, e7, e7_ano_ind)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8beda395", + "metadata": {}, + "outputs": [], + "source": [ + "pred_one_shot = avg_predicted_prob(get_message_with_example, e1, e7, e7_ano_ind)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4ae22058", + "metadata": {}, + "outputs": [], + "source": [ + "e1_ano_ind = list(range(7880-7600, 7910-7600+1))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ee0db8ee", + "metadata": {}, + "outputs": [], + "source": [ + "true_label = [0 for i in range(8200-7600+1)]\n", + "for i in range(8200-7600+1): \n", + " if i in e1_ano_ind:\n", + " true_label[i] = 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c4da01e6", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "plt.bar(list(range(8200-7600+1)), pred_one_shot, label = 'one-shot predicted')\n", + "plt.bar(list(range(8200-7600+1)), pred, label = 'zero-shot predicted', alpha = 0.8)\n", + "plt.bar(list(range(8200-7600+1)), true_label, label = 'true anomaly', alpha = 0.8)\n", + "plt.legend()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd94be47", + "metadata": {}, + "outputs": [], + "source": [ + "e1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0d95df71", + "metadata": {}, + "outputs": [], + "source": [ + "#test space option\n", + "e1 = signal_to_str(train_data, 7600, 8200, space = False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "feb40198", + "metadata": {}, + "outputs": [], + "source": [ + "e1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7d703e97", + "metadata": {}, + "outputs": [], + "source": [ + "from orion.evaluation.point import point_accuracy, point_f1_score " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3055699b", + "metadata": {}, + "outputs": [], + "source": [ + "data_span = (1222819200, 1222819205)\n", + "ground_truth = [\n", + " 1222819200, \n", + " 1222819201, \n", + " 1222819202\n", + "]\n", + "anomalies = [\n", + " 1222819201, \n", + " 1222819202, \n", + " 1222819203\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "25a6ff54", + "metadata": {}, + "outputs": [], + "source": [ + "from orion.evaluation.point import point_accuracy, point_f1_score \n", + "\n", + "start, end = data_span\n", + "\n", + "point_accuracy(ground_truth, anomalies, start=start, end=end) # 0.667\n", + "point_f1_score(ground_truth, anomalies, start=start, end=end) # 0.667" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2447c1b2", + "metadata": {}, + "outputs": [], + "source": [ + "d = {\"a\": 1}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "33035700", + "metadata": {}, + "outputs": [], + "source": [ + "d['a']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4d997f02", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.8.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}