Source code for SISSOkit.utils

import re
from collections import Iterable





[docs]class lazyproperty: r""" Lazy property """ def __init__(self, func): self.func = func def __get__(self, instance, cls): if instance is None: return self else: value = self.func(instance) setattr(instance, self.func.__name__, value) return value
[docs]def start_and_number(n_list): r""" Returns the start index and number in each turn. """ n_now=0 sn=[] for i in range(len(n_list)): sn.append([n_now,n_list[i]]) n_now+=n_list[i] return sn
[docs]def seperate_DataFrame(dataframe,n_list): r""" Returns the seperated DataFrame. """ if isinstance(n_list[0],Iterable)==False: return [dataframe.iloc[start:start+n_item] for start,n_item in start_and_number(n_list)] elif isinstance(n_list[0][0],Iterable)==False: n1=[sum(n) for n in n_list] data1=seperate_DataFrame(dataframe,n1) return [seperate_DataFrame(data,n) for data,n in zip(data1,n_list)]
[docs]def seperate_list(original_list,n_list): r""" Returns the seperated list. """ if isinstance(n_list[0],Iterable)==False: return [original_list[start:start+n_item] for start,n_item in start_and_number(n_list)] elif isinstance(n_list[0][0],Iterable)==False: n1=[sum(n) for n in n_list] data1=seperate_DataFrame(original_list,n1) return [seperate_DataFrame(data,n) for data,n in zip(data1,n_list)]
[docs]def descriptors_to_markdown(expression): r""" Returns the markdown form of expression """ operators=['+','-','*','/','exp','exp-','^-1','^2','^3','sqrt','cbrt','log','abs','^6','sin','cos','(',')'] OPTR=[] OPND=[] s='' i=0 while i < len(expression): if re.match(r'\w',expression[i]): s+=expression[i] elif expression[i]=='-' and expression[i-1]=='p': s+=expression[i] else: if s: if s in operators: OPTR.append(s) else: OPND.append(s) s='' OPTR.append(expression[i]) if expression[i]==')': OPTR.pop() if i+1<len(expression) and expression[i+1]=='^': pattern=re.compile(r'\^-?\d') power=pattern.match(expression,i+1).group() i+=len(power) operand=OPND.pop() if operand.startswith('\\frac'): operand='\\left( %s \\right)'%operand if power=='^-1': OPND.append(operand+'^{-1}') elif power=='^2': OPND.append(operand+'^2') elif power=='^3': OPND.append(operand+'^3') elif power=='^6': OPND.append(operand+'^6') OPTR.pop() elif len(OPTR)>1 and OPTR[-1]=='(': operand=OPND.pop() if OPTR[-2]=='exp': OPND.append('e^{%s}'%operand) elif OPTR[-2]=='exp-': OPND.append('e^{- \\left( %s \\right)}'%operand) elif OPTR[-2]=='sqrt': OPND.append('\\sqrt{%s}'%operand) elif OPTR[-2]=='cbrt': OPND.append('\\sqrt[3]{%s}'%operand) elif OPTR[-2]=='log': OPND.append('\\log{\\left( %s \\right)}'%operand) elif OPTR[-2]=='abs': OPND.append('\\left|{%s}\\right|'%operand) elif OPTR[-2]=='sin': OPND.append('\\sin{\\left( %s \\right)}'%operand) elif OPTR[-2]=='cos': OPND.append('\\cos{\\left( %s \\right)}'%operand) elif OPTR[-2]=='(': OPND.append(operand) OPTR.pop() i+=1 continue OPTR.pop() OPTR.pop() elif len(OPTR)==1 and OPTR[0]=='(': pass else: operand2=OPND.pop() operand1=OPND.pop() operator=OPTR.pop() OPTR.pop() if operator=='+': OPND.append('\\left( %s + %s \\right)'%(operand1,operand2)) elif operator=='-': if OPTR[-1]=='abs': OPND.append('\\left|%s - %s\\right|'%(operand1,operand2)) OPTR.pop() else: OPND.append('\\left( %s - %s \\right)'%(operand1,operand2)) elif operator=='*': OPND.append('\\left( %s * %s \\right)'%(operand1,operand2)) elif operator=='/': OPND.append('\\frac{%s}{%s}'%(operand1,operand2)) i+=1 return OPND.pop()
[docs]def scientific_notation_to_markdown(value): r""" Returns the markdown form of scientific notation form of value. """ value=str(value) if 'e' in value or 'E' in value: try: number,exponent=value.split('e') except: number,exponent=value.split('E') if exponent.startswith('+'): exponent=exponent[1:] if exponent.startswith('0'): exponent=exponent[1:] elif exponent[1]=='0': exponent='-'+exponent[2:] if exponent=='0': exponent='' elif exponent=='1': exponent='10' else: exponent='10^'+'{%s}'%exponent return number+' \\times '+exponent else: return value
[docs]def models_to_markdown(regression,task,dimension,indent=''): r""" Returns the markdown form of models. """ coefficients=regression.coefficients[task-1][dimension-1] intercepts=regression.intercepts[task-1][dimension-1] descriptors=regression.descriptors[dimension-1] model=scientific_notation_to_markdown(intercepts) for d in range(dimension): model+=indent coeff=scientific_notation_to_markdown(coefficients[d]) if coeff.startswith('-'): model+=' - ' coeff=coeff[1:] else: model+=' + ' model=model+coeff+' \\times '+descriptors_to_markdown(descriptors[d]) return model