import pandas as pd import datetime import numpy as np #import random class trandeVoter(): def __init__(self,name): self.name = name # просто имя self.trandeValuesList = ['up','none','down'] #словарь трегдов self.matrixAmounts = None # матрица сумм self.keysMatrixAmounts = None #ключи матрицы сумм, техническое поле self.matrixProbability = None # матрица вероятностей #функция которая создает df с заданным набором колонок и индексов. индексы - уникальные соотношения def createDFbyNames(self, namesIndex, namesColoms,defaultValue=0.0): df = pd.DataFrame(dict.fromkeys(namesColoms, [defaultValue]*pow(3,len(namesIndex))), index=pd.MultiIndex.from_product([self.trandeValuesList]*len(namesIndex), names=namesIndex) #,columns=namesColoms ) return(df) #создание матрицы сумм с дефолтным значением def createMatrixAmounts(self,namesIndex: list) -> pd.DataFrame(): self.matrixAmounts = self.createDFbyNames(namesIndex,self.trandeValuesList,0) self.keysMatrixAmounts = self.matrixAmounts.to_dict('tight')['index_names'] self.createMatrixProbability(namesIndex) return(self.matrixAmounts) #создание матрицы вероятностей с дефолтным значением def createMatrixProbability(self,namesIndex: list) -> pd.DataFrame(): self.matrixProbability = self.createDFbyNames(namesIndex,self.trandeValuesList) return(self.matrixProbability) #установка значений в матрицы сумм. signalDecisions - значения индикаторов key:value; trande - реальное значение def setDecisionBySignals(self,signalDecisions: dict,trande: str) -> None: buff=[] for i in self.keysMatrixAmounts: buff.append(signalDecisions[i]) self.matrixAmounts.loc[tuple(buff),trande] += 1 #заполнение матрицы вероятностей вычисляемыми значениями из матрицы сумм def generateMatrixProbability(self) -> None: for i in range(self.matrixAmounts.shape[0]): print(self.matrixAmounts) rowSum=sum(self.matrixAmounts.iloc[i]) + 1 self.matrixProbability.iloc[i]['up'] = self.matrixAmounts.iloc[i]['up'] / rowSum self.matrixProbability.iloc[i]['none'] = self.matrixAmounts.iloc[i]['none'] / rowSum self.matrixProbability.iloc[i]['down'] = self.matrixAmounts.iloc[i]['down'] / rowSum #получение рещения из матрицы вероятностей по заданным значениям сигналов def getDecisionBySignals(self,signalDecisions: dict) -> dict: ans = {} spliceSearch =self.matrixProbability.xs(tuple(signalDecisions.values()), level=list(signalDecisions.keys()) ) ans['probability'] = spliceSearch.to_dict('records')[0] ans['trande'] = spliceSearch.iloc[0].idxmax() return ans #получение матриц вероятностей и суммы в видей словарей def getMatrixDict(self) -> dict: ans={} ans['amounts'] = self.matrixAmounts.to_dict('tight') ans['probability'] = self.matrixProbability.to_dict('tight') return ans #установка матриц вероятностей и суммы в видей словарей def setMatrixDict(self,matrixDict: dict) -> dict: if matrixDict['amounts'] != None: self.matrixAmounts = pd.DataFrame.from_dict(y['amounts'], orient='tight') if matrixDict['probability'] != None: self.matrixProbability = pd.DataFrame.from_dict(y['probability'], orient='tight')