add timestamps to each metric, use rapidjson

This commit is contained in:
robcaulk 2022-10-15 13:23:01 +02:00
parent b236e362ba
commit d81eef0b70
2 changed files with 13 additions and 30 deletions

View File

@ -1,9 +1,9 @@
import collections import collections
import json
import logging import logging
import re import re
import shutil import shutil
import threading import threading
from datetime import datetime, timezone
from pathlib import Path from pathlib import Path
from typing import Any, Dict, Tuple, TypedDict from typing import Any, Dict, Tuple, TypedDict
@ -95,7 +95,7 @@ class FreqaiDataDrawer:
self.empty_pair_dict: pair_info = { self.empty_pair_dict: pair_info = {
"model_filename": "", "trained_timestamp": 0, "model_filename": "", "trained_timestamp": 0,
"data_path": "", "extras": {}} "data_path": "", "extras": {}}
self.metric_tracker: Dict[str, Dict[str, list]] = {} self.metric_tracker: Dict[str, Dict[str, Dict[str, list]]] = {}
def update_metric_tracker(self, metric: str, value: float, pair: str) -> None: def update_metric_tracker(self, metric: str, value: float, pair: str) -> None:
""" """
@ -106,9 +106,11 @@ class FreqaiDataDrawer:
if pair not in self.metric_tracker: if pair not in self.metric_tracker:
self.metric_tracker[pair] = {} self.metric_tracker[pair] = {}
if metric not in self.metric_tracker[pair]: if metric not in self.metric_tracker[pair]:
self.metric_tracker[pair][metric] = [] self.metric_tracker[pair][metric] = {'timestamp': [], 'value': []}
self.metric_tracker[pair][metric].append(value) timestamp = int(datetime.now(timezone.utc).timestamp())
self.metric_tracker[pair][metric]['value'].append(value)
self.metric_tracker[pair][metric]['timestamp'].append(timestamp)
def collect_metrics(self, time_spent: float, pair: str): def collect_metrics(self, time_spent: float, pair: str):
""" """
@ -130,7 +132,7 @@ class FreqaiDataDrawer:
exists = self.pair_dictionary_path.is_file() exists = self.pair_dictionary_path.is_file()
if exists: if exists:
with open(self.pair_dictionary_path, "r") as fp: with open(self.pair_dictionary_path, "r") as fp:
self.pair_dict = json.load(fp) self.pair_dict = rapidjson.load(fp, number_mode=rapidjson.NM_NATIVE)
elif not self.follow_mode: elif not self.follow_mode:
logger.info("Could not find existing datadrawer, starting from scratch") logger.info("Could not find existing datadrawer, starting from scratch")
else: else:
@ -148,7 +150,7 @@ class FreqaiDataDrawer:
exists = self.metric_tracker_path.is_file() exists = self.metric_tracker_path.is_file()
if exists: if exists:
with open(self.metric_tracker_path, "r") as fp: with open(self.metric_tracker_path, "r") as fp:
self.metric_tracker = json.load(fp) self.metric_tracker = rapidjson.load(fp, number_mode=rapidjson.NM_NATIVE)
else: else:
logger.info("Could not find existing metric tracker, starting from scratch") logger.info("Could not find existing metric tracker, starting from scratch")
@ -515,7 +517,7 @@ class FreqaiDataDrawer:
presaved backtesting (prediction file loading). presaved backtesting (prediction file loading).
""" """
with open(dk.data_path / f"{dk.model_filename}_metadata.json", "r") as fp: with open(dk.data_path / f"{dk.model_filename}_metadata.json", "r") as fp:
dk.data = json.load(fp) dk.data = rapidjson.load(fp, number_mode=rapidjson.NM_NATIVE)
dk.training_features_list = dk.data["training_features_list"] dk.training_features_list = dk.data["training_features_list"]
dk.label_list = dk.data["label_list"] dk.label_list = dk.data["label_list"]
@ -542,7 +544,7 @@ class FreqaiDataDrawer:
) )
with open(dk.data_path / f"{dk.model_filename}_metadata.json", "r") as fp: with open(dk.data_path / f"{dk.model_filename}_metadata.json", "r") as fp:
dk.data = json.load(fp) dk.data = rapidjson.load(fp, number_mode=rapidjson.NM_NATIVE)
dk.training_features_list = dk.data["training_features_list"] dk.training_features_list = dk.data["training_features_list"]
dk.label_list = dk.data["label_list"] dk.label_list = dk.data["label_list"]
@ -676,22 +678,3 @@ class FreqaiDataDrawer:
).reset_index(drop=True) ).reset_index(drop=True)
return corr_dataframes, base_dataframes return corr_dataframes, base_dataframes
# to be used if we want to send predictions directly to the follower instead of forcing
# follower to load models and inference
# def save_model_return_values_to_disk(self) -> None:
# with open(self.full_path / str('model_return_values.json'), "w") as fp:
# json.dump(self.model_return_values, fp, default=self.np_encoder)
# def load_model_return_values_from_disk(self, dk: FreqaiDataKitchen) -> FreqaiDataKitchen:
# exists = Path(self.full_path / str('model_return_values.json')).resolve().exists()
# if exists:
# with open(self.full_path / str('model_return_values.json'), "r") as fp:
# self.model_return_values = json.load(fp)
# elif not self.follow_mode:
# logger.info("Could not find existing datadrawer, starting from scratch")
# else:
# logger.warning(f'Follower could not find pair_dictionary at {self.full_path} '
# 'sending null values back to strategy')
# return exists, dk

View File

@ -7,7 +7,7 @@ from collections import deque
from datetime import datetime, timezone from datetime import datetime, timezone
from pathlib import Path from pathlib import Path
from threading import Lock from threading import Lock
from typing import Any, Dict, List, Tuple from typing import Any, Dict, List, Literal, Tuple
import numpy as np import numpy as np
import pandas as pd import pandas as pd
@ -657,7 +657,7 @@ class IFreqaiModel(ABC):
return return
def inference_timer(self, do: str = 'start', pair: str = ''): def inference_timer(self, do: Literal['start', 'stop'] = 'start', pair: str = ''):
""" """
Timer designed to track the cumulative time spent in FreqAI for one pass through Timer designed to track the cumulative time spent in FreqAI for one pass through
the whitelist. This will check if the time spent is more than 1/4 the time the whitelist. This will check if the time spent is more than 1/4 the time
@ -682,7 +682,7 @@ class IFreqaiModel(ABC):
self.inference_time = 0 self.inference_time = 0
return return
def train_timer(self, do: str = 'start', pair: str = ''): def train_timer(self, do: Literal['start', 'stop'] = 'start', pair: str = ''):
""" """
Timer designed to track the cumulative time spent training the full pairlist in Timer designed to track the cumulative time spent training the full pairlist in
FreqAI. FreqAI.